// RUN: %clang_cc1 -fsyntax-only -verify %s struct X { template static void f(int, int); }; void f() { void (*ptr)(int, int) = &X::f; unknown *p = 0; // expected-error {{unknown type name 'unknown'}} unknown * p + 0; // expected-error {{undeclared identifier 'unknown'}} } auto (*p)() -> int(nullptr); auto (*q)() -> int(*)(unknown); // expected-error {{unknown type name 'unknown'}} auto (*r)() -> int(*)(unknown + 1); // expected-error {{undeclared identifier 'unknown'}} int f(unknown const x); // expected-error {{unknown type name 'unknown'}} // Disambiguating an array declarator from an array subscripting. void arr() { int x[] = {1}; // expected-note 2{{previous}} // This is array indexing not an array declarator because a comma expression // is not syntactically a constant-expression. int(x[1,1]); // expected-warning 2{{unused}} // This is array indexing not an array declaration because a braced-init-list // is not syntactically a constant-expression. int(x[{0}]); // expected-error {{array subscript is not an integer}} struct A { struct Q { int n; }; int operator[](Q); } a; int(a[{0}]); // expected-warning {{unused}} // These are array declarations. int(x[(1,1)]); // expected-error {{redefinition}} int(x[true ? 1,1 : 1]); // expected-error {{redefinition}} int (*_Atomic atomic_ptr_to_int); *atomic_ptr_to_int = 42; }