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 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 (at) 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