1 // RUN: rm -rf %t
2 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s
3 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DEXTERN_C
4 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DEXTERN_CXX
5 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DEXTERN_C -DEXTERN_CXX
6 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DEXTERN_C -DNAMESPACE
7 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER
8 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C
9 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_CXX
10 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C -DEXTERN_CXX
11 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C -DNAMESPACE
12 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C -DNO_EXTERN_C_ERROR -Wno-module-import-in-extern-c
13 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C -DNAMESPACE -DNO_EXTERN_C_ERROR -Wno-module-import-in-extern-c
14 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs -x c %s
15 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -I %S/Inputs/elsewhere -I %S/Inputs %s -DEXTERN_C -DINDIRECT
16 
17 #ifdef INDIRECT
18 #include "c-header-indirect.h"
19 #endif
20 
21 #ifdef NAMESPACE
22 namespace M {
23 #endif
24 
25 #ifdef EXTERN_C
26 extern "C" {
27 #endif
28 
29 #ifdef EXTERN_CXX
30 extern "C++" {
31 #endif
32 
33 #ifdef CXX_HEADER
34 #define HEADER "cxx-header.h"
35 #else
36 #define HEADER "c-header.h"
37 #endif
38 
39 #include HEADER
40 
41 #if defined(NAMESPACE)
42 // expected-error-re@-3 {{import of module '{{c_library.inner|cxx_library}}' appears within namespace 'M'}}
43 // expected-note@-21 {{namespace 'M' begins here}}
44 #elif defined(EXTERN_C) && !defined(EXTERN_CXX) && defined(CXX_HEADER) && !defined(NO_EXTERN_C_ERROR)
45 // expected-error@-6 {{import of C++ module 'cxx_library' appears within extern "C" language linkage specification}}
46 // expected-note@-20 {{extern "C" language linkage specification begins here}}
47 #endif
48 
49 #ifdef EXTERN_CXX
50 }
51 #endif
52 
53 #ifdef EXTERN_C
54 }
55 #endif
56 
57 #ifdef NAMESPACE
58 }
59 using namespace M;
60 #endif
61 
62 #ifdef __cplusplus
63 namespace N {
64 #endif
g()65   void g() {
66     int k = f();
67   }
68 
69 #ifdef __cplusplus
70   extern "C" {
71 #endif
72     int f;
73 #if !defined(CXX_HEADER) && !defined(NAMESPACE)
74     // expected-error@-2 {{redefinition of 'f' as different kind of symbol}}
75     // expected-note@c-header.h:1 {{previous}}
76 #endif
77 
78 #ifdef __cplusplus
79   }
80 }
81 #endif
82 
83 #if !defined(NAMESPACE)
84 suppress_expected_no_diagnostics_error error_here; // expected-error {{}}
85 #endif
86