76 lines · c
1// Clear and create directories2// RUN: rm -rf %t3// RUN: mkdir %t4// RUN: mkdir %t/cache5// RUN: mkdir %t/Inputs6 7// Build first header file8// RUN: echo "#define FIRST" >> %t/Inputs/first.h9// RUN: cat %s >> %t/Inputs/first.h10 11// Build second header file12// RUN: echo "#define SECOND" >> %t/Inputs/second.h13// RUN: cat %s >> %t/Inputs/second.h14 15// Test that each header can compile16// RUN: %clang_cc1 -fsyntax-only -x c %t/Inputs/first.h17// RUN: %clang_cc1 -fsyntax-only -x c %t/Inputs/second.h18 19// Build module map file20// RUN: echo "module FirstModule {" >> %t/Inputs/module.modulemap21// RUN: echo " header \"first.h\"" >> %t/Inputs/module.modulemap22// RUN: echo "}" >> %t/Inputs/module.modulemap23// RUN: echo "module SecondModule {" >> %t/Inputs/module.modulemap24// RUN: echo " header \"second.h\"" >> %t/Inputs/module.modulemap25// RUN: echo "}" >> %t/Inputs/module.modulemap26 27// Run test28// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c -I%t/Inputs -verify %s29 30#if !defined(FIRST) && !defined(SECOND)31#include "first.h"32#include "second.h"33#endif34 35#if defined(FIRST)36enum DifferentEnumConstants { kDifferentEnumConstantsValueFirst };37#elif defined(SECOND)38enum DifferentEnumConstants { kDifferentEnumConstantsValueSecond };39#else40enum DifferentEnumConstants differentEnumConstants;41// expected-error@second.h:* {{'kDifferentEnumConstantsValueSecond' from module 'SecondModule' is not present in definition of 'enum DifferentEnumConstants' in module 'FirstModule'}}42// expected-note@first.h:* {{definition has no member 'kDifferentEnumConstantsValueSecond'}}43#endif44 45#if defined(FIRST)46enum DifferentEnumValues { kDifferentEnumValue = 0 };47#elif defined(SECOND)48enum DifferentEnumValues { kDifferentEnumValue = 1 };49#else50enum DifferentEnumValues differentEnumValue;51// 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// expected-note@second.h:* {{but in 'SecondModule' found 1st element 'kDifferentEnumValue' has different initializer}}53#endif54 55#if defined(FIRST)56enum {57 kAnonymousEnumValueFirst = 1,58};59#elif defined(SECOND)60enum {61 kAnonymousEnumValueSecond = 2,62};63#else64// Anonymous enums don't have to match, no errors expected.65int anonymousEnumValue = kAnonymousEnumValueFirst + kAnonymousEnumValueSecond;66#endif67 68// Keep macros contained to one file.69#ifdef FIRST70#undef FIRST71#endif72 73#ifdef SECOND74#undef SECOND75#endif76