xref: /llvm-project/clang/test/Modules/odr_hash-enum.c (revision 6d7d8e5b59cb0a66765ccf657814ae6039e27931)
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