Typo correction: Ignore temporary binding exprs after overload resolution
authorReid Kleckner <reid@kleckner.net>
Sat, 13 Dec 2014 00:53:10 +0000 (00:53 +0000)
committerReid Kleckner <reid@kleckner.net>
Sat, 13 Dec 2014 00:53:10 +0000 (00:53 +0000)
Transformation of a CallExpr doesn't always result in a new CallExpr.

Fixes PR21899.

llvm-svn: 224172

clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/typo-correction-delayed.cpp

index e8be716..554e8c9 100644 (file)
@@ -6105,8 +6105,13 @@ public:
     auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args,
                                                  RParenLoc, ExecConfig);
     if (auto *OE = dyn_cast<OverloadExpr>(Callee)) {
-      if (!Result.isInvalid() && Result.get())
-        OverloadResolution[OE] = cast<CallExpr>(Result.get())->getCallee();
+      if (!Result.isInvalid() && Result.get()) {
+        Expr *ResultCall = Result.get();
+        if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall))
+          ResultCall = BE->getSubExpr();
+        if (auto *CE = dyn_cast<CallExpr>(ResultCall))
+          OverloadResolution[OE] = CE->getCallee();
+      }
     }
     return Result;
   }
index d303b58..d42888f 100644 (file)
@@ -119,3 +119,23 @@ class SomeClass {
 public:
   explicit SomeClass() : Kind(kSum) {}  // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}}
 };
+
+extern "C" int printf(const char *, ...);
+
+// There used to be an issue with typo resolution inside overloads.
+struct AssertionResult {
+  ~AssertionResult();
+  operator bool();
+  int val;
+};
+AssertionResult Compare(const char *a, const char *b);
+AssertionResult Compare(int a, int b);
+int main() {
+  // expected-note@+1 {{'result' declared here}}
+  const char *result;
+  // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}}
+  if (AssertionResult ar = (Compare("value1", resulta)))
+    ;
+  else
+    printf("ar: %d\n", ar.val);
+}