blob: 7351828182037f05095290b16b4f03d777e5c692 [file] [log] [blame]
Douglas Gregorfba18aa2011-09-15 22:00:41 +00001// RUN: rm -rf %t
Douglas Gregor953a61f2013-02-07 19:01:24 +00002// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify
Douglas Gregorfba18aa2011-09-15 22:00:41 +00003
Douglas Gregore3a82562011-11-30 18:02:36 +00004#include <DependsOnModule/DependsOnModule.h> // expected-warning{{treating #include as an import of module 'DependsOnModule'}}
Douglas Gregorfba18aa2011-09-15 22:00:41 +00005
Andy Gibbsb42f2002013-04-17 08:06:46 +00006// expected-note@Inputs/NoUmbrella.framework/PrivateHeaders/A_Private.h:1{{'no_umbrella_A_private' declared here}}
7
Douglas Gregorfba18aa2011-09-15 22:00:41 +00008#ifdef MODULE_H_MACRO
9# error MODULE_H_MACRO should have been hidden
10#endif
11
12#ifdef DEPENDS_ON_MODULE
13# error DEPENDS_ON_MODULE should have been hidden
14#endif
Douglas Gregorecc2c092011-12-01 22:20:10 +000015
Douglas Gregor209977c2011-12-05 17:40:25 +000016Module *mod; // expected-error{{unknown type name 'Module'}}
17
18#import <AlsoDependsOnModule/AlsoDependsOnModule.h> // expected-warning{{treating #import as an import of module 'AlsoDependsOnModule'}}
19Module *mod2;
20
Douglas Gregor8075ce62011-12-06 17:15:11 +000021int getDependsOther() { return depends_on_module_other; }
Douglas Gregor09833922011-12-06 17:31:28 +000022
23void testSubframeworkOther() {
24 double *sfo1 = sub_framework_other; // expected-error{{use of undeclared identifier 'sub_framework_other'}}
25}
26
Douglas Gregor6a1db482011-12-09 02:04:43 +000027// Test umbrella-less submodule includes
28#include <NoUmbrella/A.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.A'}}
29int getNoUmbrellaA() { return no_umbrella_A; }
30
Douglas Gregor3b29bb92011-12-12 19:13:53 +000031// Test umbrella-less submodule includes
32#include <NoUmbrella/SubDir/C.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.SubDir.C'}}
33int getNoUmbrellaC() { return no_umbrella_C; }
34
Douglas Gregor09833922011-12-06 17:31:28 +000035// Test header cross-subframework include pattern.
Douglas Gregoref85b562011-12-06 17:34:58 +000036#include <DependsOnModule/../Frameworks/SubFramework.framework/Headers/Other.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.SubFramework.Other'}}
Douglas Gregor09833922011-12-06 17:31:28 +000037
38void testSubframeworkOtherAgain() {
39 double *sfo1 = sub_framework_other;
40}
Douglas Gregorac252a32011-12-06 19:39:29 +000041
42void testModuleSubFramework() {
43 char *msf = module_subframework;
44}
45
46#include <Module/../Frameworks/SubFramework.framework/Headers/SubFramework.h> // expected-warning{{treating #include as an import of module 'Module.SubFramework'}}
47
48void testModuleSubFrameworkAgain() {
49 char *msf = module_subframework;
50}
Douglas Gregor587986e2011-12-07 02:23:45 +000051
52// Test inclusion of private headers.
53#include <DependsOnModule/DependsOnModulePrivate.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.Private.DependsOnModule'}}
Douglas Gregor4813442c2011-12-07 21:25:07 +000054
55int getDependsOnModulePrivate() { return depends_on_module_private; }
Douglas Gregor23af6d52011-12-07 22:05:21 +000056
Douglas Gregor3a110f72012-01-13 16:54:27 +000057#include <Module/ModulePrivate.h> // includes the header
Douglas Gregor23af6d52011-12-07 22:05:21 +000058
59int getModulePrivate() { return module_private; }
Douglas Gregor6a1db482011-12-09 02:04:43 +000060
61#include <NoUmbrella/A_Private.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.Private.A_Private'}}
62int getNoUmbrellaAPrivate() { return no_umbrella_A_private; }
63
64int getNoUmbrellaBPrivateFail() { return no_umbrella_B_private; } // expected-error{{use of undeclared identifier 'no_umbrella_B_private'; did you mean 'no_umbrella_A_private'?}}
Douglas Gregor305dc3e2011-12-20 00:28:52 +000065
66// Test inclusion of headers that are under an umbrella directory but
67// not actually part of the module.
68#include <Module/NotInModule.h> // expected-warning{{treating #include as an import of module 'Module.NotInModule'}} \
69 // expected-warning{{missing submodule 'Module.NotInModule'}}
70
71int getNotInModule() {
72 return not_in_module;
73}