diff options
Diffstat (limited to 'test/Modules/auto-module-import.m')
-rw-r--r-- | test/Modules/auto-module-import.m | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/test/Modules/auto-module-import.m b/test/Modules/auto-module-import.m index 7351828..d7fb9d1 100644 --- a/test/Modules/auto-module-import.m +++ b/test/Modules/auto-module-import.m @@ -1,10 +1,12 @@ // RUN: rm -rf %t +// RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify -DERRORS // RUN: %clang_cc1 -Wauto-import -fmodules-cache-path=%t -fmodules -F %S/Inputs %s -verify +// +// Test both with and without the declarations that refer to unimported +// entities. For error recovery, those cases implicitly trigger an import. #include <DependsOnModule/DependsOnModule.h> // expected-warning{{treating #include as an import of module 'DependsOnModule'}} -// expected-note@Inputs/NoUmbrella.framework/PrivateHeaders/A_Private.h:1{{'no_umbrella_A_private' declared here}} - #ifdef MODULE_H_MACRO # error MODULE_H_MACRO should have been hidden #endif @@ -13,15 +15,21 @@ # error DEPENDS_ON_MODULE should have been hidden #endif -Module *mod; // expected-error{{unknown type name 'Module'}} - +#ifdef ERRORS +Module *mod; // expected-error{{declaration of 'Module' must be imported from module 'Module' before it is required}} +// expected-note@Inputs/Module.framework/Headers/Module.h:15 {{previous}} +#else #import <AlsoDependsOnModule/AlsoDependsOnModule.h> // expected-warning{{treating #import as an import of module 'AlsoDependsOnModule'}} +#endif Module *mod2; int getDependsOther() { return depends_on_module_other; } void testSubframeworkOther() { - double *sfo1 = sub_framework_other; // expected-error{{use of undeclared identifier 'sub_framework_other'}} +#ifdef ERRORS + double *sfo1 = sub_framework_other; // expected-error{{declaration of 'sub_framework_other' must be imported from module 'DependsOnModule.SubFramework.Other'}} + // expected-note@Inputs/DependsOnModule.framework/Frameworks/SubFramework.framework/Headers/Other.h:15 {{previous}} +#endif } // Test umbrella-less submodule includes @@ -32,8 +40,10 @@ int getNoUmbrellaA() { return no_umbrella_A; } #include <NoUmbrella/SubDir/C.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.SubDir.C'}} int getNoUmbrellaC() { return no_umbrella_C; } +#ifndef ERRORS // Test header cross-subframework include pattern. #include <DependsOnModule/../Frameworks/SubFramework.framework/Headers/Other.h> // expected-warning{{treating #include as an import of module 'DependsOnModule.SubFramework.Other'}} +#endif void testSubframeworkOtherAgain() { double *sfo1 = sub_framework_other; @@ -61,7 +71,8 @@ int getModulePrivate() { return module_private; } #include <NoUmbrella/A_Private.h> // expected-warning{{treating #include as an import of module 'NoUmbrella.Private.A_Private'}} int getNoUmbrellaAPrivate() { return no_umbrella_A_private; } -int getNoUmbrellaBPrivateFail() { return no_umbrella_B_private; } // expected-error{{use of undeclared identifier 'no_umbrella_B_private'; did you mean 'no_umbrella_A_private'?}} +int getNoUmbrellaBPrivateFail() { return no_umbrella_B_private; } // expected-error{{declaration of 'no_umbrella_B_private' must be imported from module 'NoUmbrella.Private.B_Private'}} +// expected-note@Inputs/NoUmbrella.framework/PrivateHeaders/B_Private.h:1 {{previous}} // Test inclusion of headers that are under an umbrella directory but // not actually part of the module. @@ -71,3 +82,7 @@ int getNoUmbrellaBPrivateFail() { return no_umbrella_B_private; } // expected-er int getNotInModule() { return not_in_module; } + +void includeNotAtTopLevel() { + #include <NoUmbrella/A.h> // expected-warning {{treating #include as an import}} expected-error {{expected expression}} +} |