[cfe-commits] r118631 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/SemaCXX/overloaded-name.cpp

Douglas Gregor dgregor at apple.com
Tue Nov 9 13:07:58 PST 2010


Author: dgregor
Date: Tue Nov  9 15:07:58 2010
New Revision: 118631

URL: http://llvm.org/viewvc/llvm-project?rev=118631&view=rev
Log:
Attempt to resolve overloaded functions in comma expressions and
conditional operators. Fixes PR7863.


Added:
    cfe/trunk/test/SemaCXX/overloaded-name.cpp   (with props)
Modified:
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=118631&r1=118630&r2=118631&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Nov  9 15:07:58 2010
@@ -4309,6 +4309,21 @@
 QualType Sema::CheckConditionalOperands(Expr *&Cond, Expr *&LHS, Expr *&RHS,
                                         Expr *&SAVE,
                                         SourceLocation QuestionLoc) {
+  // If both LHS and RHS are overloaded functions, try to resolve them.
+  if (Context.hasSameType(LHS->getType(), RHS->getType()) && 
+      LHS->getType()->isSpecificBuiltinType(BuiltinType::Overload)) {
+    ExprResult LHSResult = CheckPlaceholderExpr(LHS, QuestionLoc);
+    if (LHSResult.isInvalid())
+      return QualType();
+
+    ExprResult RHSResult = CheckPlaceholderExpr(RHS, QuestionLoc);
+    if (RHSResult.isInvalid())
+      return QualType();
+
+    LHS = LHSResult.take();
+    RHS = RHSResult.take();
+  }
+
   // C++ is sufficiently different to merit its own checker.
   if (getLangOptions().CPlusPlus)
     return CXXCheckConditionalOperands(Cond, LHS, RHS, SAVE, QuestionLoc);
@@ -6250,6 +6265,15 @@
 QualType Sema::CheckCommaOperands(Expr *LHS, Expr *&RHS, SourceLocation Loc) {
   DiagnoseUnusedExprResult(LHS);
 
+  ExprResult LHSResult = CheckPlaceholderExpr(LHS, Loc);
+  if (LHSResult.isInvalid()) 
+    return QualType();
+
+  ExprResult RHSResult = CheckPlaceholderExpr(RHS, Loc);
+  if (RHSResult.isInvalid())
+    return QualType();
+  RHS = RHSResult.take();
+
   // C's comma performs lvalue conversion (C99 6.3.2.1) on both its
   // operands, but not unary promotions.
   // C++'s comma does not do any conversions at all (C++ [expr.comma]p1).

Added: cfe/trunk/test/SemaCXX/overloaded-name.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/overloaded-name.cpp?rev=118631&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/overloaded-name.cpp (added)
+++ cfe/trunk/test/SemaCXX/overloaded-name.cpp Tue Nov  9 15:07:58 2010
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+int ovl(int);
+float ovl(float);
+
+template<typename T> T ovl(T);
+
+void test(bool b) {
+  (void)((void)0, ovl); // expected-error{{cannot resolve overloaded function from context}}
+  // PR7863
+  (void)(b? ovl : &ovl); // expected-error{{cannot resolve overloaded function from context}}
+  (void)(b? ovl<float> : &ovl); // expected-error{{cannot resolve overloaded function from context}}
+  (void)(b? ovl<float> : ovl<float>);
+}

Propchange: cfe/trunk/test/SemaCXX/overloaded-name.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/trunk/test/SemaCXX/overloaded-name.cpp
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cfe/trunk/test/SemaCXX/overloaded-name.cpp
------------------------------------------------------------------------------
    svn:mime-type = text/plain





More information about the cfe-commits mailing list