/*****
* errortest.asy
* Andy Hammerlindl 2003/08/08
*
* This struct attempts to trigger every error message reportable by the
* compiler to ensure that errors are being reported properly.
*****/

// name.cc
{
 // line 33
 x.y = 5;
}
{
 // line 50
 int x = z;
}
{
 // line 67
 x = 5;
}
{
 // line 84 - unreachable
}
{
 // line 95
 x y1;
 x y2();
 x y3(int);
 int y4(x);
 struct m {
   x y1;
   x y2();
   x y3(int);
   int y4(x);
 }
}
{
 // line 130
 int x;
 x.y = 4;
}
{
 // line 156
 struct m {
   int x,y;
 }
 m.u.v = 5;
}
{
 // line 186
 struct m {
   int x,y;
 }
 int x = m.z;
}
{
 // line 217
 struct m {
   int x,y;
 }
 m.z = 5;
}
{
 // line 249 - unreachable
}
{
 // line 272 - not testable without typedef
}
{
 // line 283
 struct m {
   int x,y;
 }
 m.u v;
 struct mm {
  m.u v;
 }
}

// exp.h
{
 // line 109
 5 = 4;
}
{
 // line 136
 int f, f();
 f;
 struct m { int f, f(); }
 m.f;
}

// exp.cc
{
 // line 40
 int x = {};
 int y = {4, 5, 6};
}
{
 // line 110
 int f(), f(int);
 f.m = 5;
}
{
 // line 122
 int x;
 x.m = 5;
}
{
 // line 147
 struct point {
   int x,y;
 }
 point p;
 int x = p.z;
}
{
 // line 157
 struct point {
   int x, y;
 }
 point p;
 p.z;
}
{
 // line 163
 struct point {
   int f(), f(int);
 }
 point p;
 p.f;
}
{
 // line 204
 struct point {
   int x, y;
 }
 point p;
 p.z = 5;
}
{
 // line 229 - unreachable
}
{
 // lines 261 and 275 - wait for subscript to be fully implemented.
}
{
 // line 515
 void f(int), f(int, int);
 f();
 f("Hello?");
}
{
 // line 520 - not yet testable (need int->float casting or the like)
}
{
 // line 525
 void f(int);
 f();
}
{
 // line 649
 struct point {
   int x,y;
 }
 point p;
 p = +p;
}
{
 // line 1359
 int x, f();
 (true) ? x : f;
}
{
 // line 1359
 int a, a(), b, b();
 (true) ? a : b;
}
{
 // line 1581
 int x, f();
 x = f;
}
{
 // line 1586
 int a, a(), b, b();
 a = b;
}

// newexp.cc
{
 // line 34
 int f() = new int () {
   int x = 5;
 };
}
{
 // line 64
 int x = new int;
}
{
 // line 72
 struct a {
   struct b {
   }
 }

 new a.b;
}

// stm.cc
{
 // line 86
 5;
}
{
 // line 246
 break;
}
{
 // line 261
 continue;
}
{
 // line 282
 void f() {
   return 17;
 }
}
{
 // line 288
 int f() {
   return;
 }
}

// dec.cc
{
 // line 378
 int f() {
   int x = 5;
 }
 int g() {
   if (true)
     return 7;
 }
}

// env.h
{
 // line 99
 struct m {}
 struct m {}
}
{
 // line 109
 int f() {
   return 1;
 }
 int f() {
   return 2;
 }

 int x = 1;
 int x = 2;

 struct m {
   int f() {
     return 1;
   }
   int f() {
     return 2;
   }

   int x = 1;
   int x = 2;
 }
}

// env.cc
{
 // line 107 - currently unreachable as no built-ins are currently used
 // in records.
}
{
 // line 140
 // Assuming there is a built-in function void abort(string):
 void f(string);
 abort = f;
}
{
 // line 168 - currently unreachable as no built-in functions are
 // currently used in records.
}
{
 // line 222
 int x = "Hello";
}

// Test permissions.
{
 struct A {
   private int x=4;
   restricted int y=5;

   private void f() {}
   restricted void g() {}
 }

 A a;
 a.x;
 a.x = 4;
 a.x += 5;
 a.y = 6;
 a.y += 7;

 a.f;
 a.f();
 a.f = new void() {};
 a.g = new void() {};
}
{
 struct A {
   private int x=4;
   private void f() {}
 }

 A a;
 from a unravel x;
 from a unravel f;
}
{
 struct A {
   restricted int y=5;
   restricted void g() {}
 }

 A a;
 from a unravel y,g;
 y = 6;
 y += 7;

 g = new void() {};
}
{
 struct A {
   private typedef int T;
 }
 A.T x;
 A.T x=4;
 int y=2;
 A.T x=y;
 A.T x=17+3*y;
}
{
 struct A {
   private typedef int T;
 }
 from A unravel T;
}
{
 struct A {
   private typedef int T;
 }
 A a;
 a.T x;
 a.T x=4;
 int y=2;
 a.T x=y;
 a.T x=17+3*y;
}
{
 struct A {
   private typedef int T;
 }
 A a;
 from a unravel T;
}

// Read-only settings
// Ensure that the safe and globalwrite options can't be modified inside the
// code.
{
 access settings;
 settings.safe=false;
 settings.safe=true;
 settings.globalwrite=false;
 settings.globalwrite=true;
}
{
 from settings access safe, globalwrite;
 safe=false;
 safe=true;
 globalwrite=false;
 globalwrite=true;
}
{
 from settings access safe as x, globalwrite as y;
 x=false;
 x=true;
 y=false;
 y=true;
}
{
 import settings;
 settings.safe=false;
 settings.safe=true;
 settings.globalwrite=false;
 settings.globalwrite=true;
 safe=false;
 safe=true;
 globalwrite=false;
 globalwrite=true;
}

// Test cases where var is used outside of type inference.
{
 var x;
}
{
 var f() { return 4; }
}
{
 (var)3;
 var x = (var)3;
 int y = (var)3;
}
{
 var[] b = new var[] { 1, 2, 3};
 var[] b = new int[] { 1, 2, 3};
 var[] c = {1, 2, 3};
 new var[] { 4, 5, 6};
 int[] d = new var[] { 4, 5, 6};
 new var;
}
{
 int f(var x = 3) { return 0; }
}
{
 int f, f();
 var g = f;
}
{
 struct A { int f, f(); }
 var g = A.f;
 A a;
 var h = a.f;
}
{
 int x;
 for (var i : x)
   ;
}
{
 int x, x();
 for (var i : x)
   ;
}
{
 int x, x();
 int[] x = {2,3,4};
 for (var i : x)
   ;
}
{
 int[] temp={0};
 int[] v={0};

 temp[v]= v;
}

// Keyword and rest errors.
{
 int f(string s="" ... int[] a);
 f(1,2,3 ... new int[] {4,5,6}, "hi");
 f(1,2,3 ... new int[] {4,5,6} ... new int[] {7,8,9});
 f(... new int[] {4,5,6}, "hi");
 f(... new int[] {4,5,6} ... new int[] {7,8,9});
}
{
 int f(... int[] x, int y);
 int g(... int[] x, int y) { return 7; }
 int f(string s ... int[] x, int y);
 int g(string s ... int[] x, int y) { return 7; }
 int f(int keyword x, int y);
 int g(int keyword x, int y) { return 7; }
 int f(int keyword x, int y, string z);
 int g(int keyword x, int y, string z) { return 7; }
 int f(real t, int keyword x, int y);
 int g(real t, int keyword x, int y) { return 7; }
 int f(real t, int keyword x, int y, string z);
 int g(real t, int keyword x, int y, string z) { return 7; }
}
{
 int f(int notkeyword x);
 int g(int notkeyword x) { return 7; }
 int f(real w, int notkeyword x);
 int g(real w, int notkeyword x) { return 7; }
 int f(real w, int keyword y, int notkeyword x);
 int g(real w, int keyword y, int notkeyword x) { return 7; }
 int f(real w, int notkeyword y, int keyword x);
 int g(real w, int notkeyword y, int keyword x) { return 7; }
 int f(int notkeyword x, int y, string z);
 int g(int notkeyword x, int y, string z) { return 7; }
 int f(int notkeyword x, int y);
 int g(int notkeyword x, int y) { return 7; }
 int f(int notkeyword x, int y, string z);
 int g(int notkeyword x, int y, string z) { return 7; }
 int f(real t, int notkeyword x, int y);
 int g(real t, int notkeyword x, int y) { return 7; }
 int f(real t, int notkeyword x, int y, string z);
 int g(real t, int notkeyword x, int y, string z) { return 7; }
}

// template import errors
{
 // Need to specify new name.
 access somefilename(T=int);
 // "as" misspelled
 access somefilename(T=int) notas somefilename_int;
 // missing keyword
 access somefilename(int) as somefilename_int;
 // Templated import unsupported
 import somefilename(T=int);
 // unexpected template parameters
 access errortestNonTemplate(T=int) as version;
}
{
 typedef import(T);  // this file isn't accessed as a template
 import typedef(T);  // should be "typedef import"
}
{
 // wrong number of parameters
 access errortestBrokenTemplate(A=int, B=string) as ett_a;
 // third param incorrectly named
 access errortestBrokenTemplate(A=int, B=string, T=real) as ett_b;
 // keywords in wrong order
 access errortestBrokenTemplate(A=int, C=real, B=string) as ett_c;
 // errortestBrokenTemplate.asy has extra "typedef import"
 access errortestBrokenTemplate(A=int, B=string, C=real) as ett_d;
 // expected template parameters
 access errortestBrokenTemplate as ett_e;
}

// autounravel errors
{
 struct A {
   static static int x;  // too many static modifiers
   autounravel static int y;  // no error
   static autounravel int z;  // no error
   autounravel autounravel int w;  // too many autounravel modifiers
   autounravel static autounravel int v;  // too many autounravel modifiers
   static autounravel static int u;  // too many static modifiers
   autounravel struct B {}  // types cannot be autounraveled
 }
}
{
 autounravel int x;  // top-level fields cannot be autounraveled
}
{
 struct A {
   autounravel int qaz;
   autounravel int qaz;  // cannot shadow autounravel qaz
 }
}
{
 // Even if the first (implicitly defined) instance of a function is allowed
 // to be shadowed, the (explicit) shadower cannot itself be shadowed.
 struct A {
   autounravel bool alias(A, A);  // no error
   autounravel bool alias(A, A);  // cannot shadow autounravel alias
 }
}
{
 // Non-statically nested types cannot be used as template parameters.
 struct A {
   struct B {
     autounravel int x;
   }
   access somefilename(T=B) as somefilename_B;
 }
 A a;
 access somefilename(T=a.B) as somefilename_B;
 access somefilename(T=A.B) as somefilename_B;
}
{
 // no error
 access errortestTemplate(A=int, B=string) as eft;
 // wrongly ordered names after correct load
 access errortestTemplate(B=int, A=string) as eft;
 // completely wrong names after correct load
 access errortestTemplate(C=int, D=string) as eft;
 // first name correct, second name wrong
 access errortestTemplate(A=int, D=string) as eft;
 // first name wrong, second name correct
 access errortestTemplate(C=int, B=string) as eft;
 // too few parameters
 access errortestTemplate(A=int) as eft;
 // too many parameters
 access errortestTemplate(A=int, B=string, C=real) as eft;
 // templated imports cannot be run directly
 include errortestTemplate;
}
// Test more permissions.
{
 struct A {
   static int x;
   static int f;
   static void f();
   static struct R {}
 }
 struct T {
   private static from A unravel x;
   private static from A unravel f;
   private static from A unravel R;
 }
 T.x;  // incorrectly accessing private field
 (int)T.f;  // incorrectly accessing overloaded private field
 T.f();  // incorrectly accessing overloaded private field
 T.R r;  // correctly accessing private type
 struct U {
   private static unravel A;
 }
 U.x;  // incorrectly accessing private field
 (int)U.f;  // incorrectly accessing overloaded private field
 U.f();  // incorrectly accessing overloaded private field
 U.R r;  // correctly accessing private type
}
{
 struct A {
   static struct B {
     autounravel int x;
   }
 }
 struct T {
   private from A unravel B;  // x is autounraveled from B
 }
 T.x;  // incorrectly accessing private field
}