blob: 387da72a7c39bf8a72e7bfb464761b8158425cb1 [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// SharedOptions=--enable-experiment=constructor-tearoffs
import 'dart:core' hide dynamic;
import 'dart:core' as core show dynamic;
extension E<X> on X {
X operator <(_) => this;
X operator >(_) => this;
X operator <=(_) => this;
X operator >=(_) => this;
// X operator ==(_) => this; Member of object, can't be extension method.
X operator -(_) => this;
X operator +(_) => this;
X operator /(_) => this;
X operator ~/(_) => this;
X operator *(_) => this;
X operator %(_) => this;
X operator |(_) => this;
X operator ^(_) => this;
X operator &(_) => this;
X operator <<(_) => this;
X operator >>>(_) => this;
X operator >>(_) => this;
X operator -() => this;
X operator ~() => this;
X operator [](_) => this;
operator []=(_1, _2) => this;
}
class C<X, Y> {
C();
C.named();
}
void f(_1, _2) {}
void g(_) {}
void h(_1, [_2]) {}
int i = 0;
bool boolVar = true;
class Test {
var x;
void test() {
// Test the behavior of the parser on `id<id,id> ...` where the `...`
// stands for each of the tokens in Dart. In each case, additional tokens
// are added at the end, if this can make the construct parseable.
// `f` is used to force the parse to be two expressions; `g` is used to
// force the parse to be one expression; `h` is used to allow both (in
// cases where both possibilities must be a dead end).
f(C<int, int> !true);
g(C<int, int> != 1);
f(C<int, int> """ """);
f(C<int, int> "");
// `#!` is not a symbol, there's no way to make this work.
h(C<int, int> #!); //# 1: syntax error
f(C<int, int> #foo);
h(C<int, int> % 1); //# 2: syntax error
g((C<int, int>) % 1);
h(C<int, int> %= 1); //# 3: syntax error
h(true + C<int, int> && true); //# 4: syntax error
g(true + (C<int, int>) && true);
h(C<int, int> & 1); //# 5: syntax error
g((C<int, int>) & 1);
h(C<int, int> &= 1); //# 6: syntax error
g(C<int, int>());
g(C<int, int>);
h(C<int, int> * 1); //# 7: syntax error
g((C<int, int>) * 1);
h(C<int, int> */ 1); //# 8: syntax error
h(C<int, int> *= 1); //# 9: syntax error
h(C<int, int> + 1); //# 10: syntax error
g((C<int, int>) + 1);
f(C<int, int> ++ i);
h(C<int, int> += 1); //# 11: syntax error
f(C<int, int> , 1);
f(C<int, int> - 1);
f(C<int, int> -- i);
h(C<int, int> -= 1); //# 12: syntax error
g(C<int, int> . named());
h(C<int, int> .. toString()); //# 13: syntax error
g((C<int, int>) .. toString());
h(C<int, int> ...); //# 14: syntax error
h(C<int, int> ...?); //# 15: syntax error
h(C<int, int> / 1); //# 16: syntax error
g((C<int, int>) / 1);
g(C<int, int> /**/); //# 17: ok
f(C<int, int> /**/ - 1);
g(C<int, int> //
);
f(C<int, int> //
-
1);
h(C<int, int> /= 1); //# 18: syntax error
g({C<int, int> : 1});
C<int, int> ; //# 19: ok
h(C<int, int> < 1); //# 20: syntax error
g((C<int, int>) < 1);
h(C<int, int> << 1); //# 21: syntax error
g((C<int, int>) << 1);
h(C<int, int> <<= 1); //# 22: syntax error
h(C<int, int> <= 1); //# 23: syntax error
g((C<int, int>) <= 1);
h(C<int, int> = 1); //# 24: syntax error
g(C<int, int> == 1);
h(C<int, int> =>); //# 25: syntax error
// The operator `>>` is a single token in the grammar.
h(C<int, int> > 1); //# 26: syntax error
h((C<int, int>) > 1);
h(true + C<int, int> ? 1 : 1); //# 27: syntax error
g(true + (C<int, int>) ? 1 : 1);
g(C<int, int> ?. toString()); //# 28: syntax error
g((boolVar ? null : C<int, int>) ?. toString());
h(C<int, int> ?.. toString()); //# 29: syntax error
h(C<int, int> ?? 1); //# 30: syntax error
g(null + (C<int, int>) ?? 1);
h(C<int, int> ??= 1); //# 31: syntax error
h(C<int, int> @deprecated 1); //# 32: syntax error
f(C<int, int> [ 1 ]);
f(C<int, int> '');
f(C<int, int> ''' ''');
g([ C<int, int> ]);
h(C<int, int> ^ 1); //# 33: syntax error
g((C<int, int>) ^ 1);
h(C<int, int> ^= 1); //# 34: syntax error
h(C<int, int> | 1); //# 35: syntax error
g((C<int, int>) | 1);
h(C<int, int> |= 1); //# 36: syntax error
h(true + C<int, int> || true); //# 37: syntax error
g(true + (C<int, int>) || true);
f(C<int, int> ~ 1);
h(C<int, int> ~/ 1); //# 38: syntax error
g((C<int, int>) ~/ 1);
h(C<int, int> ~/= 1); //# 39: syntax error
f(C<int, int> {});
g({ C<int, int> });
// Keywords with no special status.
{
var async, hide, of, on, show, sync;
f(C<int, int> async);
f(C<int, int> hide);
f(C<int, int> of);
f(C<int, int> on);
f(C<int, int> show);
f(C<int, int> sync);
}
// Contextual reserved words (no special status here).
{
var await, yield;
f(C<int, int> await);
f(C<int, int> yield);
}
// Built-in identifiers.
{
var abstract, as, covariant, deferred, dynamic, export;
var extension, external, factory, Function, get, implements;
var import, interface, late, library, mixin, operator, part;
var required, set, static, typedef;
f(C<int, int> abstract);
f(C<int, int> as);
g((C<int, int>) as core.dynamic);
f(C<int, int> covariant);
f(C<int, int> deferred);
f(C<int, int> dynamic);
f(C<int, int> export);
f(C<int, int> extension);
f(C<int, int> external);
f(C<int, int> factory);
f(C<int, int> Function);
f(C<int, int> get);
f(C<int, int> implements);
f(C<int, int> import);
f(C<int, int> interface);
f(C<int, int> late);
f(C<int, int> library);
f(C<int, int> mixin);
f(C<int, int> operator);
f(C<int, int> part);
f(C<int, int> required);
f(C<int, int> set);
f(C<int, int> static);
f(C<int, int> typedef);
}
// Reserved words.
h(C<int, int> assert(true)); //# 40: syntax error
switch (1) {
case 0: C<int, int> break; //# 41: syntax error
C<int, int> case 1: break; //# 42: syntax error
}
h(C<int, int> catch); //# 43: syntax error
h(C<int, int> class D {}); //# 44: syntax error
f(C<int, int> const []);
while (++i < 10) {
C<int, int> continue; //# 45: syntax error
}
h(C<int, int> default); //# 46: syntax error
h(C<int, int> do); //# 47: syntax error
h(C<int, int> else); //# 48: syntax error
h(C<int, int> enum {}); //# 49: syntax error
h(C<int, int> extends C); //# 50: syntax error
f(C<int, int> false);
h(C<int, int> final); //# 51: syntax error
h(C<int, int> finally); //# 52: syntax error
h(C<int, int> for); //# 53: syntax error
h(C<int, int> if); //# 54: syntax error
h(C<int, int> in); //# 55: syntax error
h(C<int, int> is Object); //# 56: syntax error
g((C<int, int>) is Object);
f(C<int, int> new C());
f(C<int, int> null);
h(C<int, int> rethrow); //# 57: syntax error
h(C<int, int> return); //# 58: syntax error
f(C<int, int> super.toString);
h(C<int, int> switch); //# 59: syntax error
f(C<int, int> this.x);
// Right operand of `>` is a `<bitwiseOrExpression>`, and `throw 0` isn't.
h(C<int, int> throw 0); //# 60: syntax error
f(C<int, int> true);
h(C<int, int> try); //# 61: syntax error
h(C<int, int> var); //# 62: syntax error
h(C<int, int> void); //# 63: syntax error
h(C<int, int> while); //# 64: syntax error
h(C<int, int> with); //# 65: syntax error
}
}
void main() {
Test().test();
}