| // 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 |