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 22namespace M { 23#endif 24 25#ifdef EXTERN_C 26extern "C" { 27#endif 28 29#ifdef EXTERN_CXX 30extern "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} 59using namespace M; 60#endif 61 62#ifdef __cplusplus 63namespace 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@c-header.h:1 {{previous}} 76#endif 77 78#ifdef __cplusplus 79 } 80} 81#endif 82 83#if !defined(NAMESPACE) 84suppress_expected_no_diagnostics_error error_here; // expected-error {{}} 85#endif 86