1 // RUN: %clang_cc1 -std=c++2a -verify %s 2 // RUN: %clang_cc1 -std=c++2a -verify %s -DIMPORT_ERROR=1 3 // RUN: %clang_cc1 -std=c++2a -verify %s -DIMPORT_ERROR=2 4 5 module; 6 7 #if IMPORT_ERROR != 2 8 struct import { struct inner {}; }; 9 #endif 10 struct module { struct inner {}; }; 11 12 constexpr int n = 123; 13 14 export module m; // #1 15 16 // Import errors are fatal, so we test them in isolation. 17 #if IMPORT_ERROR == 1 18 import x = {}; // expected-error {{module 'x' not found}} 19 20 #elif IMPORT_ERROR == 2 21 struct X; 22 template<int> struct import; 23 template<> struct import<n> { 24 static X y; 25 }; 26 27 // This is not valid because the 'import <n>' is a pp-import, even though it 28 // grammatically can't possibly be an import declaration. 29 struct X {} import<n>::y; // expected-error {{'n' file not found}} 30 31 #else 32 module y = {}; // expected-error {{multiple module declarations}} expected-error 2{{}} 33 // expected-note@#1 {{previous module declaration}} 34 35 ::import x = {}; 36 ::module y = {}; 37 38 import::inner xi = {}; 39 module::inner yi = {}; 40 41 namespace N { 42 module a; 43 import b; 44 } 45 46 extern "C++" module cxxm; 47 extern "C++" import cxxi; 48 49 template<typename T> module module_var_template; 50 51 // This is a variable named 'import' that shadows the type 'import' above. 52 struct X {} import; 53 #endif 54