]> granicus.if.org Git - clang/commitdiff
PR9615: make sure we destroy any temporaries returned by operator->.
authorEli Friedman <eli.friedman@gmail.com>
Mon, 4 Apr 2011 01:18:25 +0000 (01:18 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 4 Apr 2011 01:18:25 +0000 (01:18 +0000)
I'm pretty sure this is the right fix, but I would appreciate it if someone
else would double-check.

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

lib/Sema/SemaOverload.cpp
test/SemaCXX/operator-arrow-temporary.cpp [new file with mode: 0644]

index c023cd3b2a4f1486b5221673b0dedb6cc696b46f..5b444c14d6fc2e5676f73686d353f9ccd9319463 100644 (file)
@@ -8934,7 +8934,8 @@ Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) {
   if (CheckCallReturnType(Method->getResultType(), OpLoc, TheCall,
                           Method))
           return ExprError();
-  return Owned(TheCall);
+
+  return MaybeBindToTemporary(TheCall);
 }
 
 /// FixOverloadedFunctionReference - E is an expression that refers to
diff --git a/test/SemaCXX/operator-arrow-temporary.cpp b/test/SemaCXX/operator-arrow-temporary.cpp
new file mode 100644 (file)
index 0000000..8e79609
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// PR9615
+
+struct Resource {
+  void doit();
+};
+
+template<int x> struct Lock {
+  ~Lock() { int a[x]; } // expected-error {{declared as an array with a negative size}}
+  Resource* operator->() { return 0; }
+};
+
+struct Accessor {
+  Lock<-1> operator->();
+};
+
+// Make sure we try to instantiate the destructor for Lock here
+void f() { Accessor acc; acc->doit(); } // expected-note {{requested here}}
+