xref: /aosp_15_r20/external/clang/test/Modules/auto-module-import.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: rm -rf %t
2*67e74705SXin Li// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -F %S/Inputs %s -verify -DERRORS
3*67e74705SXin Li// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -F %S/Inputs %s -verify
4*67e74705SXin Li// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -F %S/Inputs -xobjective-c++ %s -verify
5*67e74705SXin Li//
6*67e74705SXin Li// Test both with and without the declarations that refer to unimported
7*67e74705SXin Li// entities. For error recovery, those cases implicitly trigger an import.
8*67e74705SXin Li
9*67e74705SXin Li#include <DependsOnModule/DependsOnModule.h> // expected-warning{{treating #include as an import of module 'DependsOnModule'}}
10*67e74705SXin Li
11*67e74705SXin Li#ifdef MODULE_H_MACRO
12*67e74705SXin Li#  error MODULE_H_MACRO should have been hidden
13*67e74705SXin Li#endif
14*67e74705SXin Li
15*67e74705SXin Li#ifdef DEPENDS_ON_MODULE
16*67e74705SXin Li#  error DEPENDS_ON_MODULE should have been hidden
17*67e74705SXin Li#endif
18*67e74705SXin Li
19*67e74705SXin Li#ifdef ERRORS
20*67e74705SXin LiModule *mod; // expected-error{{declaration of 'Module' must be imported from module 'Module' before it is required}}
21*67e74705SXin Li// expected-note@Inputs/Module.framework/Headers/Module.h:15 {{previous}}
22*67e74705SXin Li#else
23*67e74705SXin Li#import <AlsoDependsOnModule/AlsoDependsOnModule.h> // expected-warning{{treating #import as an import of module 'AlsoDependsOnModule'}}
24*67e74705SXin Li#endif
25*67e74705SXin LiModule *mod2;
26*67e74705SXin Li
27*67e74705SXin Liint getDependsOther() { return depends_on_module_other; }
28*67e74705SXin Li
29*67e74705SXin Livoid testSubframeworkOther() {
30*67e74705SXin Li#ifdef ERRORS
31*67e74705SXin Li  double *sfo1 = sub_framework_other; // expected-error{{declaration of 'sub_framework_other' must be imported from module 'DependsOnModule.SubFramework.Other'}}
32*67e74705SXin Li  // expected-note@Inputs/DependsOnModule.framework/Frameworks/SubFramework.framework/Headers/Other.h:15 {{previous}}
33*67e74705SXin Li#endif
34*67e74705SXin Li}
35*67e74705SXin Li
36*67e74705SXin Li// Test umbrella-less submodule includes
37*67e74705SXin Li#include <NoUmbrella/A.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.A'}}
38*67e74705SXin Liint getNoUmbrellaA() { return no_umbrella_A; }
39*67e74705SXin Li
40*67e74705SXin Li// Test umbrella-less submodule includes
41*67e74705SXin Li#include <NoUmbrella/SubDir/C.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.SubDir.C'}}
42*67e74705SXin Liint getNoUmbrellaC() { return no_umbrella_C; }
43*67e74705SXin Li
44*67e74705SXin Li#ifndef ERRORS
45*67e74705SXin Li// Test header cross-subframework include pattern.
46*67e74705SXin Li#include <DependsOnModule/../Frameworks/SubFramework.framework/Headers/Other.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.SubFramework.Other'}}
47*67e74705SXin Li#endif
48*67e74705SXin Li
49*67e74705SXin Livoid testSubframeworkOtherAgain() {
50*67e74705SXin Li  double *sfo1 = sub_framework_other;
51*67e74705SXin Li}
52*67e74705SXin Li
53*67e74705SXin Livoid testModuleSubFramework() {
54*67e74705SXin Li  char *msf = module_subframework;
55*67e74705SXin Li}
56*67e74705SXin Li
57*67e74705SXin Li#include <Module/../Frameworks/SubFramework.framework/Headers/SubFramework.h> // expected-warning{{treating #include as an import of module 'Module.SubFramework'}}
58*67e74705SXin Li
59*67e74705SXin Livoid testModuleSubFrameworkAgain() {
60*67e74705SXin Li  char *msf = module_subframework;
61*67e74705SXin Li}
62*67e74705SXin Li
63*67e74705SXin Li// Test inclusion of private headers.
64*67e74705SXin Li#include <DependsOnModule/DependsOnModulePrivate.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.Private.DependsOnModule'}}
65*67e74705SXin Li
66*67e74705SXin Liint getDependsOnModulePrivate() { return depends_on_module_private; }
67*67e74705SXin Li
68*67e74705SXin Li#include <Module/ModulePrivate.h> // includes the header
69*67e74705SXin Li
70*67e74705SXin Liint getModulePrivate() { return module_private; }
71*67e74705SXin Li
72*67e74705SXin Li#include <NoUmbrella/A_Private.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.Private.A_Private'}}
73*67e74705SXin Liint getNoUmbrellaAPrivate() { return no_umbrella_A_private; }
74*67e74705SXin Li
75*67e74705SXin Liint getNoUmbrellaBPrivateFail() { return no_umbrella_B_private; } // expected-error{{declaration of 'no_umbrella_B_private' must be imported from module 'NoUmbrella.Private.B_Private'}}
76*67e74705SXin Li// expected-note@Inputs/NoUmbrella.framework/PrivateHeaders/B_Private.h:1 {{previous}}
77*67e74705SXin Li
78*67e74705SXin Li// Test inclusion of headers that are under an umbrella directory but
79*67e74705SXin Li// not actually part of the module.
80*67e74705SXin Li#include <Module/NotInModule.h> // expected-warning{{treating #include as an import of module 'Module.NotInModule'}} \
81*67e74705SXin Li  // expected-warning{{missing submodule 'Module.NotInModule'}}
82*67e74705SXin Li
83*67e74705SXin Liint getNotInModule() {
84*67e74705SXin Li  return not_in_module;
85*67e74705SXin Li}
86*67e74705SXin Li
87*67e74705SXin Livoid includeNotAtTopLevel() { // expected-note {{function 'includeNotAtTopLevel' begins here}}
88*67e74705SXin Li  #include <NoUmbrella/A.h> // expected-warning {{treating #include as an import}} \
89*67e74705SXin Li			       expected-error {{redundant #include of module 'NoUmbrella.A' appears within function 'includeNotAtTopLevel'}}
90*67e74705SXin Li}
91*67e74705SXin Li
92*67e74705SXin Li#ifdef __cplusplus
93*67e74705SXin Linamespace NS { // expected-note {{begins here}}
94*67e74705SXin Li#include <NoUmbrella/A.h> // expected-warning {{treating #include as an import}} \
95*67e74705SXin Li                             expected-error {{redundant #include of module 'NoUmbrella.A' appears within namespace 'NS'}}
96*67e74705SXin Li}
97*67e74705SXin Liextern "C" { // expected-note {{begins here}}
98*67e74705SXin Li#include <NoUmbrella/A.h> // expected-warning {{treating #include as an import}} \
99*67e74705SXin Li                             expected-error {{import of C++ module 'NoUmbrella.A' appears within extern "C"}}
100*67e74705SXin Li}
101*67e74705SXin Li#endif
102