1// RUN: rm -rf %t
2// RUN: %clang_cc1 -fsyntax-only -DC1 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify
3// RUN: %clang_cc1 -fsyntax-only -DC1 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify
4// RUN: %clang_cc1 -fsyntax-only -DD1 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify
5// RUN: %clang_cc1 -fsyntax-only -DD1 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify
6// RUN: %clang_cc1 -fsyntax-only -DD2 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify
7// RUN: %clang_cc1 -fsyntax-only -DD2 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify
8// RUN: %clang_cc1 -fsyntax-only -DF1 -I%S/Inputs/macro-reexport %s -fmodules-cache-path=%t -verify
9// RUN: %clang_cc1 -fsyntax-only -DF1 -I%S/Inputs/macro-reexport -fmodules %s -fmodules-cache-path=%t -verify
10
11#if defined(F1)
12#include "f1.h"
13void f() { return assert(true); } // expected-error {{undeclared identifier 'd'}}
14#include "e2.h" // undefines d1's macro
15void g() { return assert(true); } // expected-error {{undeclared identifier 'assert'}}
16#elif defined(D1)
17#include "e1.h" // undefines c1's macro but not d1's macro
18#include "d1.h"
19void f() { return assert(true); } // expected-error {{undeclared identifier 'd'}}
20#include "e2.h" // undefines d1's macro
21void g() { return assert(true); } // expected-error {{undeclared identifier 'assert'}}
22#elif defined(D2)
23#include "d2.h"
24void f() { return assert(true); } // expected-error {{undeclared identifier 'b'}}
25#else
26// e2 undefines d1's macro, which overrides c1's macro.
27#include "e2.h"
28#include "c1.h"
29void f() { return assert(true); } // expected-error {{undeclared identifier 'assert'}}
30#endif
31