| // 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 |
| // RUN: %clang_cc1 -std=c++2a %s -fmodule-file=%t.pcm -fsyntax-only -verify -I%S/Inputs |
| |
| template<int> struct import; // expected-note 2{{previous}} |
| constexpr struct { int h; } empty = {0}; |
| struct A; |
| struct B; |
| struct C; |
| template<> struct import<0> { |
| static A a; |
| static B b; |
| static C c; |
| }; |
| |
| // OK, not an import-declaration. |
| struct A {} |
| ::import |
| <empty.h>::a; |
| |
| // This is invalid: the tokens after 'import' are a header-name, so cannot be |
| // parsed as a template-argument-list. |
| struct B {} |
| import // expected-error {{redefinition of 'import'}} expected-error {{expected ';'}} |
| <empty.h>::b; // (error recovery skips these tokens) |
| |
| // Likewise, this is ill-formed after the tokens are reconstituted into a |
| // header-name token. |
| struct C {} |
| import // expected-error {{redefinition of 'import'}} expected-error {{expected ';'}} |
| < |
| empty.h // (error recovery skips these tokens) |
| >::c; |