// Copyright (c) 2017, 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.

// @dart = 2.9

// From The Dart Programming Language Specification, section 16.33
// "Identifier Reference":
//
// "A built-in identifier is one of the identifiers produced by the
// production BUILT_IN_IDENTIFIER. It is a compile-time error if a
// built-in identifier is used as the declared name of a prefix, class,
// type parameter or type alias. It is a compile-time error to use a
// built-in identifier other than dynamic in a type annotation or type
// parameter."
//
// Observation: it is illegal to use a built-in identifier other than
// `dynamic` in a type annotation. A type annotation is not fully defined
// in the specification, so we assume this means that the grammar
// production "type" cannot be a built-in identifier, and it cannot contain
// a built-in identifier at a location where it must denote a type.
//
// Note that we have several ways to use built-in identifiers other than
// `dynamic` in other locations in a type, e.g., `Function(int set)`.

final // optional type before variable must not be a built-in identifier.
abstract //              //# abstract: syntax error
as //                    //# as: syntax error
covariant //             //# covariant: syntax error
deferred //              //# deferred: syntax error
dynamic //               //# dynamic: ok
export //                //# export: syntax error
external //              //# external: syntax error
factory //               //# factory: syntax error
get //                   //# get: syntax error
implements //            //# implements: syntax error
import //                //# import: syntax error
interface //             //# interface: syntax error
library //               //# library: syntax error
mixin //                 //# mixin: syntax error
operator //              //# operator: syntax error
part //                  //# part: syntax error
set //                   //# set: syntax error
static //                //# static: syntax error
typedef //               //# typedef: syntax error

abstract<int> //         //# abstract-gen: syntax error
as<int> //               //# as-gen: syntax error
covariant<int> //        //# covariant-gen: syntax error
deferred<int> //         //# deferred-gen: syntax error
dynamic<int> //          //# dynamic-gen: compile-time error
export<int> //           //# export-gen: syntax error
external<int> //         //# external-gen: syntax error
factory<int> //          //# factory-gen: syntax error
get<int> //              //# get-gen: syntax error
implements<int> //       //# implements-gen: syntax error
import<int> //           //# import-gen: syntax error
interface<int> //        //# interface-gen: syntax error
library<int> //          //# library-gen: syntax error
mixin<int> //            //# mixin-gen: syntax error
operator<int> //         //# operator-gen: syntax error
part<int> //             //# part-gen: syntax error
set<int> //              //# set-gen: syntax error
static<int> //           //# static-gen: syntax error
typedef<int> //          //# typedef-gen: syntax error

List<abstract> //        //# abstract-list: syntax error
List<as> //              //# as-list: syntax error
List<covariant> //       //# covariant-list: syntax error
List<deferred> //        //# deferred-list: syntax error
List<dynamic> //         //# dynamic-list: ok
List<export> //          //# export-list: syntax error
List<external> //        //# external-list: syntax error
List<factory> //         //# factory-list: syntax error
List<get> //             //# get-list: syntax error
List<implements> //      //# implements-list: syntax error
List<import> //          //# import-list: syntax error
List<interface> //       //# interface-list: syntax error
List<library> //         //# library-list: syntax error
List<mixin> //           //# mixin-list: syntax error
List<operator> //        //# operator-list: syntax error
List<part> //            //# part-list: syntax error
List<set> //             //# set-list: syntax error
List<static> //          //# static-list: syntax error
List<typedef> //         //# typedef-list: syntax error

Function(abstract) //    //# abstract-funarg: syntax error
Function(as) //          //# as-funarg: syntax error
Function(covariant) //   //# covariant-funarg: syntax error
Function(deferred) //    //# deferred-funarg: syntax error
Function(dynamic) //     //# dynamic-funarg: ok
Function(export) //      //# export-funarg: syntax error
Function(external) //    //# external-funarg: syntax error
Function(factory) //     //# factory-funarg: syntax error
Function(get) //         //# get-funarg: syntax error
Function(implements) //  //# implements-funarg: syntax error
Function(import) //      //# import-funarg: syntax error
Function(interface) //   //# interface-funarg: syntax error
Function(library) //     //# library-funarg: syntax error
Function(mixin) //       //# mixin-funarg: syntax error
Function(operator) //    //# operator-funarg: syntax error
Function(part) //        //# part-funarg: syntax error
Function(set) //         //# set-funarg: syntax error
Function(static) //      //# static-funarg: syntax error
Function(typedef) //     //# typedef-funarg: syntax error

abstract Function() //   //# abstract-funret: syntax error
as Function() //         //# as-funret: syntax error
covariant Function() //  //# covariant-funret: syntax error
deferred Function() //   //# deferred-funret: syntax error
dynamic Function() //    //# dynamic-funret: ok
export Function() //     //# export-funret: syntax error
external Function() //   //# external-funret: syntax error
factory Function() //    //# factory-funret: syntax error
get Function() //        //# get-funret: syntax error
implements Function() // //# implements-funret: syntax error
import Function() //     //# import-funret: syntax error
interface Function() //  //# interface-funret: syntax error
library Function() //    //# library-funret: syntax error
mixin Function() //      //# mixin-funret: syntax error
operator Function() //   //# operator-funret: syntax error
part Function() //       //# part-funret: syntax error
set Function() //        //# set-funret: syntax error
static Function() //     //# static-funret: syntax error
typedef Function() //    //# typedef-funret: syntax error

x = null;

main() {
  x.toString();
}
