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