18af8b861SRichard Smith // RUN: %clang_cc1 -std=c++2a -emit-header-module -fmodule-name=attrs -x c++-header %S/Inputs/empty.h %S/Inputs/attrs.h -o %t.pcm
28af8b861SRichard Smith // RUN: %clang_cc1 -std=c++2a %s -fmodule-file=%t.pcm -fsyntax-only -verify -I%S/Inputs
38af8b861SRichard Smith 
48af8b861SRichard Smith template<int> struct import; // expected-note 2{{previous}}
58af8b861SRichard Smith constexpr struct { int h; } empty = {0};
68af8b861SRichard Smith struct A;
78af8b861SRichard Smith struct B;
88af8b861SRichard Smith struct C;
98af8b861SRichard Smith template<> struct import<0> {
108af8b861SRichard Smith   static A a;
118af8b861SRichard Smith   static B b;
128af8b861SRichard Smith   static C c;
138af8b861SRichard Smith };
148af8b861SRichard Smith 
158af8b861SRichard Smith // OK, not an import-declaration.
16*1600e245SRichard Smith struct A {}
178af8b861SRichard Smith ::import
18*1600e245SRichard Smith <empty.h>::a;
198af8b861SRichard Smith 
208af8b861SRichard Smith // This is invalid: the tokens after 'import' are a header-name, so cannot be
218af8b861SRichard Smith // parsed as a template-argument-list.
228af8b861SRichard Smith struct B {}
238af8b861SRichard Smith import // expected-error {{redefinition of 'import'}} expected-error {{expected ';'}}
248af8b861SRichard Smith <empty.h>::b; // (error recovery skips these tokens)
258af8b861SRichard Smith 
268af8b861SRichard Smith // Likewise, this is ill-formed after the tokens are reconstituted into a
278af8b861SRichard Smith // header-name token.
288af8b861SRichard Smith struct C {}
298af8b861SRichard Smith import // expected-error {{redefinition of 'import'}} expected-error {{expected ';'}}
308af8b861SRichard Smith <
318af8b861SRichard Smith empty.h // (error recovery skips these tokens)
328af8b861SRichard Smith >::c;
33