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