1*6d7d8e5bSVolodymyr Sapsai // Clear and create directories 2*6d7d8e5bSVolodymyr Sapsai // RUN: rm -rf %t 3*6d7d8e5bSVolodymyr Sapsai // RUN: mkdir %t 4*6d7d8e5bSVolodymyr Sapsai // RUN: mkdir %t/cache 5*6d7d8e5bSVolodymyr Sapsai // RUN: mkdir %t/Inputs 6*6d7d8e5bSVolodymyr Sapsai 7*6d7d8e5bSVolodymyr Sapsai // Build first header file 8*6d7d8e5bSVolodymyr Sapsai // RUN: echo "#define FIRST" >> %t/Inputs/first.h 9*6d7d8e5bSVolodymyr Sapsai // RUN: cat %s >> %t/Inputs/first.h 10*6d7d8e5bSVolodymyr Sapsai 11*6d7d8e5bSVolodymyr Sapsai // Build second header file 12*6d7d8e5bSVolodymyr Sapsai // RUN: echo "#define SECOND" >> %t/Inputs/second.h 13*6d7d8e5bSVolodymyr Sapsai // RUN: cat %s >> %t/Inputs/second.h 14*6d7d8e5bSVolodymyr Sapsai 15*6d7d8e5bSVolodymyr Sapsai // Test that each header can compile 16*6d7d8e5bSVolodymyr Sapsai // RUN: %clang_cc1 -fsyntax-only -x c %t/Inputs/first.h 17*6d7d8e5bSVolodymyr Sapsai // RUN: %clang_cc1 -fsyntax-only -x c %t/Inputs/second.h 18*6d7d8e5bSVolodymyr Sapsai 19*6d7d8e5bSVolodymyr Sapsai // Build module map file 20*6d7d8e5bSVolodymyr Sapsai // RUN: echo "module FirstModule {" >> %t/Inputs/module.modulemap 21*6d7d8e5bSVolodymyr Sapsai // RUN: echo " header \"first.h\"" >> %t/Inputs/module.modulemap 22*6d7d8e5bSVolodymyr Sapsai // RUN: echo "}" >> %t/Inputs/module.modulemap 23*6d7d8e5bSVolodymyr Sapsai // RUN: echo "module SecondModule {" >> %t/Inputs/module.modulemap 24*6d7d8e5bSVolodymyr Sapsai // RUN: echo " header \"second.h\"" >> %t/Inputs/module.modulemap 25*6d7d8e5bSVolodymyr Sapsai // RUN: echo "}" >> %t/Inputs/module.modulemap 26*6d7d8e5bSVolodymyr Sapsai 27*6d7d8e5bSVolodymyr Sapsai // Run test 28*6d7d8e5bSVolodymyr Sapsai // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c -I%t/Inputs -verify %s 29*6d7d8e5bSVolodymyr Sapsai 30*6d7d8e5bSVolodymyr Sapsai #if !defined(FIRST) && !defined(SECOND) 31*6d7d8e5bSVolodymyr Sapsai #include "first.h" 32*6d7d8e5bSVolodymyr Sapsai #include "second.h" 33*6d7d8e5bSVolodymyr Sapsai #endif 34*6d7d8e5bSVolodymyr Sapsai 35*6d7d8e5bSVolodymyr Sapsai #if defined(FIRST) 36*6d7d8e5bSVolodymyr Sapsai enum DifferentEnumConstants { kDifferentEnumConstantsValueFirst }; 37*6d7d8e5bSVolodymyr Sapsai #elif defined(SECOND) 38*6d7d8e5bSVolodymyr Sapsai enum DifferentEnumConstants { kDifferentEnumConstantsValueSecond }; 39*6d7d8e5bSVolodymyr Sapsai #else 40*6d7d8e5bSVolodymyr Sapsai enum DifferentEnumConstants differentEnumConstants; 41*6d7d8e5bSVolodymyr Sapsai // expected-error@second.h:* {{'kDifferentEnumConstantsValueSecond' from module 'SecondModule' is not present in definition of 'enum DifferentEnumConstants' in module 'FirstModule'}} 42*6d7d8e5bSVolodymyr Sapsai // expected-note@first.h:* {{definition has no member 'kDifferentEnumConstantsValueSecond'}} 43*6d7d8e5bSVolodymyr Sapsai #endif 44*6d7d8e5bSVolodymyr Sapsai 45*6d7d8e5bSVolodymyr Sapsai #if defined(FIRST) 46*6d7d8e5bSVolodymyr Sapsai enum DifferentEnumValues { kDifferentEnumValue = 0 }; 47*6d7d8e5bSVolodymyr Sapsai #elif defined(SECOND) 48*6d7d8e5bSVolodymyr Sapsai enum DifferentEnumValues { kDifferentEnumValue = 1 }; 49*6d7d8e5bSVolodymyr Sapsai #else 50*6d7d8e5bSVolodymyr Sapsai enum DifferentEnumValues differentEnumValue; 51*6d7d8e5bSVolodymyr Sapsai // expected-error@first.h:* {{'DifferentEnumValues' has different definitions in different modules; definition in module 'FirstModule' first difference is 1st element 'kDifferentEnumValue' has an initializer}} 52*6d7d8e5bSVolodymyr Sapsai // expected-note@second.h:* {{but in 'SecondModule' found 1st element 'kDifferentEnumValue' has different initializer}} 53*6d7d8e5bSVolodymyr Sapsai #endif 54*6d7d8e5bSVolodymyr Sapsai 55*6d7d8e5bSVolodymyr Sapsai #if defined(FIRST) 56*6d7d8e5bSVolodymyr Sapsai enum { 57*6d7d8e5bSVolodymyr Sapsai kAnonymousEnumValueFirst = 1, 58*6d7d8e5bSVolodymyr Sapsai }; 59*6d7d8e5bSVolodymyr Sapsai #elif defined(SECOND) 60*6d7d8e5bSVolodymyr Sapsai enum { 61*6d7d8e5bSVolodymyr Sapsai kAnonymousEnumValueSecond = 2, 62*6d7d8e5bSVolodymyr Sapsai }; 63*6d7d8e5bSVolodymyr Sapsai #else 64*6d7d8e5bSVolodymyr Sapsai // Anonymous enums don't have to match, no errors expected. 65*6d7d8e5bSVolodymyr Sapsai int anonymousEnumValue = kAnonymousEnumValueFirst + kAnonymousEnumValueSecond; 66*6d7d8e5bSVolodymyr Sapsai #endif 67*6d7d8e5bSVolodymyr Sapsai 68*6d7d8e5bSVolodymyr Sapsai // Keep macros contained to one file. 69*6d7d8e5bSVolodymyr Sapsai #ifdef FIRST 70*6d7d8e5bSVolodymyr Sapsai #undef FIRST 71*6d7d8e5bSVolodymyr Sapsai #endif 72*6d7d8e5bSVolodymyr Sapsai 73*6d7d8e5bSVolodymyr Sapsai #ifdef SECOND 74*6d7d8e5bSVolodymyr Sapsai #undef SECOND 75*6d7d8e5bSVolodymyr Sapsai #endif 76