xref: /llvm-project/clang/test/Modules/extern_cxx.cpp (revision f4f62003f452ff49894fc9fa44b93d7a1b1a8b19)
1*f4f62003SRichard Smith // RUN: %clang_cc1 -x c++-module-map -fmodule-name=A -verify %s -fmodules-local-submodule-visibility
2*f4f62003SRichard Smith module A { module B {} module C {} }
3*f4f62003SRichard Smith 
4*f4f62003SRichard Smith #pragma clang module contents
5*f4f62003SRichard Smith 
6*f4f62003SRichard Smith #pragma clang module begin A.B
7*f4f62003SRichard Smith extern "C++" {
8*f4f62003SRichard Smith   #pragma clang module begin A.C
9*f4f62003SRichard Smith   template<typename T> void f(T t);
10*f4f62003SRichard Smith   #pragma clang module end
11*f4f62003SRichard Smith 
12*f4f62003SRichard Smith   void g() { f(0); } // ok
13*f4f62003SRichard Smith }
14*f4f62003SRichard Smith 
15*f4f62003SRichard Smith extern "C++" {
16*f4f62003SRichard Smith   #pragma clang module begin A.C
17*f4f62003SRichard Smith   } // expected-error {{extraneous closing brace}}
18*f4f62003SRichard Smith   #pragma clang module end
19*f4f62003SRichard Smith 
20*f4f62003SRichard Smith   #pragma clang module begin A.C
21*f4f62003SRichard Smith   extern "C++" { // expected-note {{to match this '{'}}
22*f4f62003SRichard Smith   #pragma clang module end // expected-error {{expected '}' at end of module}}
23*f4f62003SRichard Smith }
24*f4f62003SRichard Smith 
25*f4f62003SRichard Smith #pragma clang module end
26