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 20namespace M { 21#endif 22 23#ifdef EXTERN_C 24extern "C" { 25#endif 26 27#ifdef EXTERN_CXX 28extern "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} 57using namespace M; 58#endif 59 60#ifdef __cplusplus 61namespace 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@c-header.h:1 {{previous}} 74#endif 75 76#ifdef __cplusplus 77 } 78} 79#endif 80 81suppress_expected_no_diagnostics_error error_here; // expected-error {{}} 82