1// RUN: rm -rf %t 2// RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -DUSE_1 -DUSE_2 -DUSE_3 -DUSE_4 3// RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -DUSE_2 -DUSE_3 -DUSE_4 4// RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -DUSE_3 -DUSE_4 5// RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -DUSE_4 6 7// expected-note@Inputs/def.h:5 0-1{{previous}} 8// expected-note@Inputs/def.h:16 0-1{{previous}} 9// expected-note@Inputs/def-include.h:11 0-1{{previous}} 10 11@class Def; 12Def *def; 13class Def2; // expected-note 0-1{{forward decl}} 14Def2 *def2; 15namespace Def3NS { class Def3; } // expected-note 0-1{{forward decl}} 16Def3NS::Def3 *def3; 17 18@interface Unrelated 19- defMethod; 20@end 21 22@import decldef; 23#ifdef USE_1 24A *a1; // expected-error{{declaration of 'A' must be imported from module 'decldef.Def'}} 25B *b1; 26#define USED 27#endif 28@import decldef.Decl; 29 30A *a2; 31B *b; 32 33void testA(A *a) { 34#ifdef USE_2 35 a->ivar = 17; 36 #ifndef USED 37 // expected-error@-2{{definition of 'A' must be imported from module 'decldef.Def' before it is required}} 38 #define USED 39 #endif 40#endif 41} 42 43void testB() { 44#ifdef USE_3 45 B b; 46 #ifndef USED 47 // expected-error@-2{{definition of 'B' must be imported from module 'decldef.Def' before it is required}} 48 #define USED 49 #endif 50#endif 51} 52 53void testDef() { 54 [def defMethod]; 55} 56 57void testDef2() { 58#ifdef USE_4 59 def2->func(); 60 def3->func(); 61 #ifndef USED 62 // expected-error@-3 {{definition of 'Def2' must be imported}} 63 #define USED 64 #endif 65#endif 66} 67