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