diff options
author | Richard Trieu <rtrieu@google.com> | 2018-09-04 22:53:19 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2018-09-04 22:53:19 +0000 |
commit | 22ddc282b5df5b651bee678900788699dd70b95e (patch) | |
tree | 9d32281a097fb075e5969cbc4f26cf9d90a936f5 /clang/test/Modules/odr_hash-vector.cpp | |
parent | 470db781151d240e12c3a7f1000b54b0b2c8fcde (diff) | |
download | bcm5719-llvm-22ddc282b5df5b651bee678900788699dd70b95e.tar.gz bcm5719-llvm-22ddc282b5df5b651bee678900788699dd70b95e.zip |
[ODRHash] Extend hash to support all Type's.
llvm-svn: 341421
Diffstat (limited to 'clang/test/Modules/odr_hash-vector.cpp')
-rw-r--r-- | clang/test/Modules/odr_hash-vector.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/clang/test/Modules/odr_hash-vector.cpp b/clang/test/Modules/odr_hash-vector.cpp new file mode 100644 index 00000000000..ee59cb617c1 --- /dev/null +++ b/clang/test/Modules/odr_hash-vector.cpp @@ -0,0 +1,128 @@ +// 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 |