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