// Clear and create directories // RUN: rm -rf %t // RUN: mkdir %t // RUN: mkdir %t/cache // RUN: mkdir %t/Inputs // Build first header file // RUN: echo "#define FIRST" >> %t/Inputs/first.h // RUN: cat %s >> %t/Inputs/first.h // Build second header file // RUN: echo "#define SECOND" >> %t/Inputs/second.h // RUN: cat %s >> %t/Inputs/second.h // Test that each header can compile // RUN: %clang_cc1 -fsyntax-only -x c++ -std=c++11 %t/Inputs/first.h -fzvector // RUN: %clang_cc1 -fsyntax-only -x c++ -std=c++11 %t/Inputs/second.h -fzvector // Build module map file // RUN: echo "module FirstModule {" >> %t/Inputs/module.map // RUN: echo " header \"first.h\"" >> %t/Inputs/module.map // RUN: echo "}" >> %t/Inputs/module.map // RUN: echo "module SecondModule {" >> %t/Inputs/module.map // RUN: echo " header \"second.h\"" >> %t/Inputs/module.map // RUN: echo "}" >> %t/Inputs/module.map // Run test // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c++ -I%t/Inputs -verify %s -std=c++11 -fzvector #if !defined(FIRST) && !defined(SECOND) #include "first.h" #include "second.h" #endif namespace Types { namespace Vector { #if defined(FIRST) struct Invalid1 { __attribute((vector_size(8))) int x; }; struct Invalid2 { __attribute((vector_size(8))) int x; }; struct Invalid3 { __attribute((vector_size(16))) int x; }; struct Valid { __attribute((vector_size(8))) int x1; __attribute((vector_size(16))) int x2; __attribute((vector_size(8))) unsigned x3; __attribute((vector_size(16))) long x4; vector unsigned x5; vector int x6; }; #elif defined(SECOND) struct Invalid1 { __attribute((vector_size(16))) int x; }; struct Invalid2 { __attribute((vector_size(8))) unsigned x; }; struct Invalid3 { vector unsigned x; }; struct Valid { __attribute((vector_size(8))) int x1; __attribute((vector_size(16))) int x2; __attribute((vector_size(8))) unsigned x3; __attribute((vector_size(16))) long x4; vector unsigned x5; vector int x6; }; #else Invalid1 i1; // expected-error@second.h:* {{'Types::Vector::Invalid1::x' from module 'SecondModule' is not present in definition of 'Types::Vector::Invalid1' in module 'FirstModule'}} // expected-note@first.h:* {{declaration of 'x' does not match}} Invalid2 i2; // expected-error@second.h:* {{'Types::Vector::Invalid2::x' from module 'SecondModule' is not present in definition of 'Types::Vector::Invalid2' in module 'FirstModule'}} // expected-note@first.h:* {{declaration of 'x' does not match}} Invalid3 i3; // expected-error@second.h:* {{'Types::Vector::Invalid3::x' from module 'SecondModule' is not present in definition of 'Types::Vector::Invalid3' in module 'FirstModule'}} // expected-note@first.h:* {{declaration of 'x' does not match}} Valid v; #endif } // namespace Vector namespace ExtVector { } // namespace ExtVector #if defined(FIRST) struct Invalid { using f = __attribute__((ext_vector_type(4))) float; }; struct Valid { using f = __attribute__((ext_vector_type(8))) float; }; #elif defined(SECOND) struct Invalid { using f = __attribute__((ext_vector_type(8))) float; }; struct Valid { using f = __attribute__((ext_vector_type(8))) float; }; #else Invalid i; // expected-error@first.h:* {{'Types::Invalid::f' from module 'FirstModule' is not present in definition of 'Types::Invalid' in module 'SecondModule'}} // expected-note@second.h:* {{declaration of 'f' does not match}} Valid v; #endif } // namespace Types // Keep macros contained to one file. #ifdef FIRST #undef FIRST #endif #ifdef SECOND #undef SECOND #endif #ifdef ACCESS #undef ACCESS #endif