70 lines · cpp
1// RUN: rm -rf %t2// RUN: split-file %s %t3 4// RUN: %clang_cc1 -std=c++20 -verify %t/M.cpp5// RUN: %clang_cc1 -std=c++20 -verify %t/ImportError1.cpp6// RUN: %clang_cc1 -std=c++20 -verify %t/ImportError2.cpp7 8//--- M.cpp9module;10 11struct import { struct inner {}; };12struct module { struct inner {}; };13constexpr int n = 123;14 15export module m; // #116module y = {}; // expected-error {{multiple module declarations}} expected-error 2{{}}17// expected-note@#1 {{previous module declaration}}18 19::import x = {};20::module y = {};21 22import::inner xi = {};23module::inner yi = {};24 25namespace N {26 module a;27 import b;28}29 30extern "C++" module cxxm;31extern "C++" import cxxi;32 33template<typename T> module module_var_template;34 35// This is a variable named 'import' that shadows the type 'import' above.36struct X {} import;37 38//--- ImportError1.cpp39module;40 41struct import { struct inner {}; };42struct module { struct inner {}; };43 44constexpr int n = 123;45 46export module m; // #147 48import x = {}; // expected-error {{expected ';' after module name}}49 // expected-error@-1 {{module 'x' not found}}50 51//--- ImportError2.cpp52module;53 54struct module { struct inner {}; };55 56constexpr int n = 123;57 58export module m; // #159 60struct X;61template<int> struct import;62template<> struct import<n> {63 static X y;64};65 66// This is not valid because the 'import <n>' is a pp-import, even though it67// grammatically can't possibly be an import declaration.68struct X {} import<n>::y; // expected-error {{'n' file not found}}69 70