diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-08-20 20:35:18 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-08-20 20:35:18 +0000 |
commit | e156254d4c366b2e6d2323e92c8df73cd0dd6c90 (patch) | |
tree | c03619d9de5d77d5f77bd67cb0f01c5ade1cb763 /clang/test/Modules | |
parent | d2cd2a4e1e9daf87a7754dc8f50fec48b3370e6f (diff) | |
download | bcm5719-llvm-e156254d4c366b2e6d2323e92c8df73cd0dd6c90.tar.gz bcm5719-llvm-e156254d4c366b2e6d2323e92c8df73cd0dd6c90.zip |
During typo correction, check for an exact match in an unimported module. If we
find one, then report the error as a missing import instead of as a typo.
llvm-svn: 188821
Diffstat (limited to 'clang/test/Modules')
-rw-r--r-- | clang/test/Modules/auto-module-import.m | 23 | ||||
-rw-r--r-- | clang/test/Modules/decldef.m | 12 | ||||
-rw-r--r-- | clang/test/Modules/decldef.mm | 14 | ||||
-rw-r--r-- | clang/test/Modules/normal-module-map.cpp | 4 | ||||
-rw-r--r-- | clang/test/Modules/subframeworks.m | 3 | ||||
-rw-r--r-- | clang/test/Modules/submodules.cpp | 8 |
6 files changed, 44 insertions, 20 deletions
diff --git a/clang/test/Modules/auto-module-import.m b/clang/test/Modules/auto-module-import.m index 73518281820..23bb63b924e 100644 --- a/clang/test/Modules/auto-module-import.m +++ b/clang/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. diff --git a/clang/test/Modules/decldef.m b/clang/test/Modules/decldef.m index 7ed82b57e9c..efd2d7c42c8 100644 --- a/clang/test/Modules/decldef.m +++ b/clang/test/Modules/decldef.m @@ -1,13 +1,16 @@ // RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -DUSE_EARLY // RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -// expected-note@Inputs/def.h:5 {{previous definition is here}} +// expected-note@Inputs/def.h:5 {{previous}} @class Def; Def *def; @import decldef; -A *a1; // expected-error{{unknown type name 'A'}} +#ifdef USE_EARLY +A *a1; // expected-error{{declaration of 'A' must be imported from module 'decldef.Def' before it is required}} +#endif B *b1; // expected-error{{must use 'struct' tag to refer to type 'B'}} @import decldef.Decl; @@ -15,7 +18,10 @@ A *a2; struct B *b; void testA(A *a) { - a->ivar = 17; // expected-error{{definition of 'A' must be imported from module 'decldef.Def' before it is required}} + a->ivar = 17; +#ifndef USE_EARLY + // expected-error@-2{{definition of 'A' must be imported from module 'decldef.Def' before it is required}} +#endif } void testB() { diff --git a/clang/test/Modules/decldef.mm b/clang/test/Modules/decldef.mm index 593f53b2c6c..c693c7f2ba5 100644 --- a/clang/test/Modules/decldef.mm +++ b/clang/test/Modules/decldef.mm @@ -1,7 +1,8 @@ // RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -DUSE_EARLY // RUN: %clang_cc1 -fmodules -fobjc-arc -I %S/Inputs -fmodules-cache-path=%t %s -verify -// expected-note@Inputs/def.h:5 {{previous definition is here}} +// expected-note@Inputs/def.h:5 {{previous}} @class Def; Def *def; @@ -13,15 +14,20 @@ Def2 *def2; @end @import decldef; -A *a1; // expected-error{{unknown type name 'A'}} -B *b1; // expected-error{{unknown type name 'B'}} +#ifdef USE_EARLY +A *a1; // expected-error{{declaration of 'A' must be imported from module 'decldef.Def'}} +B *b1; +#endif @import decldef.Decl; A *a2; B *b; void testA(A *a) { - a->ivar = 17; // expected-error{{definition of 'A' must be imported from module 'decldef.Def' before it is required}} + a->ivar = 17; +#ifndef USE_EARLY + // expected-error@-2{{definition of 'A' must be imported from module 'decldef.Def' before it is required}} +#endif } void testB() { diff --git a/clang/test/Modules/normal-module-map.cpp b/clang/test/Modules/normal-module-map.cpp index 8155318fb31..70fed60b129 100644 --- a/clang/test/Modules/normal-module-map.cpp +++ b/clang/test/Modules/normal-module-map.cpp @@ -24,8 +24,8 @@ int testNestedUmbrellaA() { int testNestedUmbrellaBFail() { return nested_umbrella_b; - // expected-error@-1{{use of undeclared identifier 'nested_umbrella_b'; did you mean 'nested_umbrella_a'?}} - // expected-note@Inputs/normal-module-map/nested_umbrella/a.h:1{{'nested_umbrella_a' declared here}} + // expected-error@-1{{declaration of 'nested_umbrella_b' must be imported from module 'nested_umbrella.b' before it is required}} + // expected-note@Inputs/normal-module-map/nested_umbrella/b.h:1{{previous}} } @import nested_umbrella.b; diff --git a/clang/test/Modules/subframeworks.m b/clang/test/Modules/subframeworks.m index ad70cc2b22f..5d70bc0840d 100644 --- a/clang/test/Modules/subframeworks.m +++ b/clang/test/Modules/subframeworks.m @@ -5,7 +5,8 @@ @import DependsOnModule; void testSubFramework() { - float *sf1 = sub_framework; // expected-error{{use of undeclared identifier 'sub_framework'}} + float *sf1 = sub_framework; // expected-error{{declaration of 'sub_framework' must be imported from module 'DependsOnModule.SubFramework' before it is required}} + // expected-note@Inputs/DependsOnModule.framework/Frameworks/SubFramework.framework/Headers/SubFramework.h:2 {{previous}} } @import DependsOnModule.SubFramework; diff --git a/clang/test/Modules/submodules.cpp b/clang/test/Modules/submodules.cpp index 1b4f5d886e3..c653dddbbb5 100644 --- a/clang/test/Modules/submodules.cpp +++ b/clang/test/Modules/submodules.cpp @@ -7,8 +7,9 @@ vector<int> vi; // Note: remove_reference is not visible yet. -remove_reference<int&>::type *int_ptr = 0; // expected-error{{unknown type name 'remove_reference'}} \ -// expected-error{{expected unqualified-id}} +remove_reference<int&>::type *int_ptr = 0; // expected-error{{declaration of 'remove_reference' must be imported from module 'std.type_traits' before it is required}} +// expected-note@Inputs/submodules/type_traits.h:2{{previous}} +// expected-note@Inputs/submodules/hash_map.h:1{{previous}} @import std.typetraits; // expected-error{{no submodule named 'typetraits' in module 'std'; did you mean 'type_traits'?}} @@ -20,8 +21,7 @@ remove_reference<int&>::type *int_ptr2 = 0; @import std; // import everything in 'std' // hash_map still isn't available. -hash_map<int, float> ints_to_floats; // expected-error{{unknown type name 'hash_map'}} \ -// expected-error{{expected unqualified-id}} +hash_map<int, float> ints_to_floats; // expected-error{{declaration of 'hash_map' must be imported from module 'std.hash_map' before it is required}} @import std.hash_map; |