Skip to content
Snippets Groups Projects
Commit d314abef authored by John McCall's avatar John McCall
Browse files

Don't put too much thought into whether or not to capture a

type-dependent intermediate result in a postfix ++ pseudo-
object operation.

Test case by Tong Shen.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179637 91177308-0d34-0410-b5e6-96231b3b80d8
parent fb599a4c
No related branches found
No related tags found
No related merge requests found
...@@ -441,7 +441,8 @@ PseudoOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc, ...@@ -441,7 +441,8 @@ PseudoOpBuilder::buildIncDecOperation(Scope *Sc, SourceLocation opcLoc,
QualType resultType = result.get()->getType(); QualType resultType = result.get()->getType();
// That's the postfix result. // That's the postfix result.
if (UnaryOperator::isPostfix(opcode) && CanCaptureValueOfType(resultType)) { if (UnaryOperator::isPostfix(opcode) &&
(result.get()->isTypeDependent() || CanCaptureValueOfType(resultType))) {
result = capture(result.take()); result = capture(result.take());
setResultToLastSemantic(); setResultToLastSemantic();
} }
......
...@@ -302,13 +302,14 @@ struct SP9 { ...@@ -302,13 +302,14 @@ struct SP9 {
T GetV() { return 0; } T GetV() { return 0; }
void SetV(T v) {} void SetV(T v) {}
void f() { V = this->V; V < this->V; } void f() { V = this->V; V < this->V; }
//void g() { V++; } void g() { V++; }
//void h() { V*=2; } void h() { V*=2; }
}; };
struct SP10 { struct SP10 {
SP10(int v) {} SP10(int v) {}
bool operator<(const SP10& v) { return true; } bool operator<(const SP10& v) { return true; }
SP10 operator*(int v) { return *this; } SP10 operator*(int v) { return *this; }
SP10 operator+(int v) { return *this; }
SP10& operator=(const SP10& v) { return *this; } SP10& operator=(const SP10& v) { return *this; }
}; };
void TestSP9() { void TestSP9() {
...@@ -329,6 +330,6 @@ void TestSP9() { ...@@ -329,6 +330,6 @@ void TestSP9() {
SP9<SP10> c3; SP9<SP10> c3;
c3.f(); // Overloaded binary op operand c3.f(); // Overloaded binary op operand
//c3.g(); // Overloaded incdec op operand c3.g(); // Overloaded incdec op operand
//c3.h(); // Overloaded unary op operand c3.h(); // Overloaded unary op operand
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment