|  | // 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.modulemap | 
|  | // RUN: echo "    header \"first.h\""   >> %t/Inputs/module.modulemap | 
|  | // RUN: echo "}"                        >> %t/Inputs/module.modulemap | 
|  | // RUN: echo "module SecondModule {"    >> %t/Inputs/module.modulemap | 
|  | // RUN: echo "    header \"second.h\""  >> %t/Inputs/module.modulemap | 
|  | // RUN: echo "}"                        >> %t/Inputs/module.modulemap | 
|  |  | 
|  | // 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 |