]> granicus.if.org Git - clang/commitdiff
[typo-correction] Apply name specifier corrections when forming a NNS
authorReid Kleckner <rnk@google.com>
Tue, 16 Feb 2016 19:16:20 +0000 (19:16 +0000)
committerReid Kleckner <rnk@google.com>
Tue, 16 Feb 2016 19:16:20 +0000 (19:16 +0000)
Previously we would leave behind the old name specifier prefix, which
creates an invalid AST.  Other callers of CorrectTypo update their
CXXScopeSpec objects with the correction specifier if one is present.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@260993 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaCXXScopeSpec.cpp
test/SemaCXX/typo-correction-crash.cpp

index f7aace625a9266b69fa51a31d0508e780b2126d1..2e774dd28ce5bde148f2f66f62a22d4e4d1dbf87 100644 (file)
@@ -606,6 +606,10 @@ bool Sema::BuildCXXNestedNameSpecifier(Scope *S,
         diagnoseTypo(Corrected, PDiag(diag::err_undeclared_var_use_suggest)
                                   << Name);
 
+      if (Corrected.getCorrectionSpecifier())
+        SS.MakeTrivial(Context, Corrected.getCorrectionSpecifier(),
+                       SourceRange(Found.getNameLoc()));
+
       if (NamedDecl *ND = Corrected.getFoundDecl())
         Found.addDecl(ND);
       Found.setLookupName(Corrected.getCorrection());
index f01facd603eeec9569a87872f893e6383c0c021e..6349937ccd9de1a7590e56faddc07d5bf017bf43 100644 (file)
@@ -9,3 +9,11 @@ auto check2() {
   return "s";
   return tes; // expected-error {{use of undeclared identifier 'tes'; did you mean 'test'?}}
 }
+
+namespace BarNamespace {
+namespace NestedNamespace { // expected-note {{'BarNamespace::NestedNamespace' declared here}}
+typedef int type;
+}
+}
+struct FooRecord { };
+FooRecord::NestedNamespace::type x; // expected-error {{no member named 'NestedNamespace' in 'FooRecord'; did you mean 'BarNamespace::NestedNamespace'?}}