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