]> granicus.if.org Git - clang/commitdiff
Check for placeholder expressions before promoting an argument passed
authorDouglas Gregor <dgregor@apple.com>
Fri, 17 Jun 2011 00:15:10 +0000 (00:15 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 17 Jun 2011 00:15:10 +0000 (00:15 +0000)
through an ellipsis. Fixes <rdar://problem/9623945>.

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

lib/Sema/SemaExpr.cpp
test/SemaCXX/overloaded-name.cpp

index 2c988d15e33eb10ea263847e0ee2d62dbebc6ea2..fe11c7e4fea1ecd79634381ee9beaf06bd9272da 100644 (file)
@@ -439,7 +439,11 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) {
 /// interfaces passed by value.
 ExprResult Sema::DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT,
                                                   FunctionDecl *FDecl) {
-  ExprResult ExprRes = DefaultArgumentPromotion(E);
+  ExprResult ExprRes = CheckPlaceholderExpr(E);
+  if (ExprRes.isInvalid())
+    return ExprError();
+  
+  ExprRes = DefaultArgumentPromotion(E);
   if (ExprRes.isInvalid())
     return ExprError();
   E = ExprRes.take();
index 5a87cc8e67e6c37b2565b50c8c82b30404eac1ea..73f12a902723ae1f697e7f78632c41444d7ed876 100644 (file)
@@ -12,3 +12,19 @@ void test(bool b) {
   (void)(b? ovl<float> : &ovl); // expected-error{{cannot resolve overloaded function 'ovl' from context}}
   (void)(b? ovl<float> : ovl<float>);
 }
+
+namespace rdar9623945 {
+  void f(...) {
+  }
+  
+  class X {
+  public:
+    const char* text(void);
+    void g(void) {
+      f(text());
+      f(text); // expected-error{{a bound member function may only be called}}
+      f(text());
+      f(text); // expected-error{{a bound member function may only be called}}
+    }
+  };
+}