Fix two small bugs in typo correction. One assertion failure building member expressi...
authorNick Lewycky <nicholas@mxc.ca>
Sat, 13 Dec 2014 02:54:28 +0000 (02:54 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sat, 13 Dec 2014 02:54:28 +0000 (02:54 +0000)
The testcase shows a third bug with a FIXME in it.

llvm-svn: 224183

clang/lib/Parse/ParseExpr.cpp
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/typo-correction-pt2.cpp

index ee8f4d9..a89036a 100644 (file)
@@ -1366,7 +1366,9 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
                                               Idx.get(), RLoc);
       } else {
         (void)Actions.CorrectDelayedTyposInExpr(LHS);
+        (void)Actions.CorrectDelayedTyposInExpr(Idx);
         LHS = ExprError();
+        Idx = ExprError();
       }
 
       // Match the ']'.
index ad376f1..1f9c1ea 100644 (file)
@@ -5961,9 +5961,10 @@ static ExprResult attemptRecovery(Sema &SemaRef,
     NewSS = *SS;
 
   if (auto *ND = TC.getCorrectionDecl()) {
+    R.setLookupName(ND->getDeclName());
     R.addDecl(ND);
     if (ND->isCXXClassMember()) {
-      // Figure out the correct naming class to ad to the LookupResult.
+      // Figure out the correct naming class to add to the LookupResult.
       CXXRecordDecl *Record = nullptr;
       if (auto *NNS = TC.getCorrectionSpecifier())
         Record = NNS->getAsType()->getAsCXXRecordDecl();
index 5d3f123..73c8cb5 100644 (file)
@@ -332,3 +332,27 @@ int test(Foo f) {
   return 0;
 }
 };
+
+namespace testMemberExprDeclarationNameInfo {
+  // The AST should only have the corrected name with no mention of 'data_'.
+  // FIXME: the second typo is being printed out with the location of the first
+  // because the TypoCorrection objects contain the SourceRange but the
+  // UnqualifiedTyposCorrected cache is keyed on IdentifierInfo.
+  void f(int);
+  struct S {
+    int data;  // expected-note 2{{'data' declared here}}
+    void m_fn1() {
+      data_[] =  // expected-error 2{{use of undeclared identifier 'data_'}}  expected-error {{expected expression}}
+          f(data_);
+    }
+  };
+}
+
+namespace testArraySubscriptIndex {
+  struct S {
+    int foodata;  // expected-note {{'foodata' declared here}}
+    void m_fn1() {
+      (+)[foodata_];  // expected-error{{expected expression}} expected-error {{use of undeclared identifier 'foodata_'; did you mean 'foodata'}}
+    }
+  };
+}