]> granicus.if.org Git - clang/commitdiff
Call MaybeBindToTemporary for overloaded binary and unary operators.
authorAnders Carlsson <andersca@mac.com>
Sun, 16 Aug 2009 04:11:06 +0000 (04:11 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 16 Aug 2009 04:11:06 +0000 (04:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79173 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
lib/Sema/SemaOverload.cpp
test/CodeGenCXX/temp-1.cpp

index b92ecac6a316775d539116635219120c5c0283a4..fa5ce9f0478fce0f7058210146ef4c44fc5d4758 100644 (file)
@@ -588,6 +588,9 @@ bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
     // effects (e.g. a placement new with an uninitialized POD).
   case CXXDeleteExprClass:
     return false;
+  case CXXBindTemporaryExprClass:
+    return cast<CXXBindTemporaryExpr>(this)
+      ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2);
   case CXXExprWithTemporariesClass:
     return cast<CXXExprWithTemporaries>(this)
       ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2);
index d4187f2ce1b8a31ff63786c7cbf97eccd2fcc6f6..6b76ce80d7971060fe55b312bc280f3a0bd3280f 100644 (file)
@@ -4041,9 +4041,10 @@ Sema::OwningExprResult Sema::CreateOverloadedUnaryOp(SourceLocation OpLoc,
       UsualUnaryConversions(FnExpr);
       
       input.release();
-      return Owned(new (Context) CXXOperatorCallExpr(Context, Op, FnExpr,
-                                                     &Input, 1, ResultTy, 
-                                                     OpLoc));
+      
+      Expr *CE = new (Context) CXXOperatorCallExpr(Context, Op, FnExpr, 
+                                                   &Input, 1, ResultTy, OpLoc);
+      return MaybeBindToTemporary(CE);
     } else {
       // We matched a built-in operator. Convert the arguments, then
       // break out so that we will build the appropriate built-in
@@ -4196,9 +4197,9 @@ Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
                                                  OpLoc);
         UsualUnaryConversions(FnExpr);
 
-        return Owned(new (Context) CXXOperatorCallExpr(Context, Op, FnExpr, 
-                                                       Args, 2, ResultTy, 
-                                                       OpLoc));
+        Expr *CE = new (Context) CXXOperatorCallExpr(Context, Op, FnExpr, 
+                                                     Args, 2, ResultTy, OpLoc);
+        return MaybeBindToTemporary(CE);
       } else {
         // We matched a built-in operator. Convert the arguments, then
         // break out so that we will build the appropriate built-in
index 737bf65b47345ca65be665d7515219126a9513b9..19a6acecf284ca305b1c252b406aa2b5dd5fd92c 100644 (file)
@@ -49,9 +49,23 @@ struct D {
 };
 
 // RUN: grep "call void @_ZN1DC1Ev" %t | count 1 &&
-// RUN: grep "call void @_ZN1DD1Ev" %t | count 2
+// RUN: grep "call void @_ZN1DD1Ev" %t | count 2 &&
 void f4() {
   D()();
 }
 
+// Overloaded operators
+struct E {
+  E();
+  ~E();
+  E operator+(const E&);
+  E operator!();
+};
+
+// RUN: grep "call void @_ZN1EC1Ev" %t | count 3 &&
+// RUN: grep "call void @_ZN1ED1Ev" %t | count 5 
+void f5() {
+  E() + E();
+  !E();
+}