PR9615: make sure we destroy any temporaries returned by operator->.

I'm pretty sure this is the right fix, but I would appreciate it if someone
else would double-check.

llvm-svn: 128806
This commit is contained in:
Eli Friedman 2011-04-04 01:18:25 +00:00
parent 2642d34551
commit 2d9c47ea6c
2 changed files with 21 additions and 1 deletions

View 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

View File

@ -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}}