// 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++ %t/Inputs/first.h -cl-std=CL2.0 // RUN: %clang_cc1 -fsyntax-only -x c++ %t/Inputs/second.h -cl-std=CL2.0 // 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 -cl-std=CL2.0 #if !defined(FIRST) && !defined(SECOND) #include "first.h" #include "second.h" #endif #if defined(FIRST) void invalid1() { typedef read_only pipe int x; } void invalid2() { typedef read_only pipe int x; } void valid() { typedef read_only pipe int x; typedef write_only pipe int y; typedef read_write pipe int z; } #elif defined(SECOND) void invalid1() { typedef write_only pipe int x; } void invalid2() { typedef read_only pipe float x; } void valid() { typedef read_only pipe int x; typedef write_only pipe int y; typedef read_write pipe int z; } #else void run() { invalid1(); // expected-error@second.h:* {{'invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}} // expected-note@first.h:* {{but in 'FirstModule' found a different body}} invalid2(); // expected-error@second.h:* {{'invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}} // expected-note@first.h:* {{but in 'FirstModule' found a different body}} valid(); } #endif // Keep macros contained to one file. #ifdef FIRST #undef FIRST #endif #ifdef SECOND #undef SECOND #endif