When checking for illegal expressions in a default-argument

expression, look through pseudo-object expressions.

rdar://13602832

llvm-svn: 179080
This commit is contained in:
John McCall 2013-04-09 01:56:28 +00:00
parent 8ccbc18efa
commit 7353c86a4e
2 changed files with 36 additions and 0 deletions

View File

@ -65,6 +65,7 @@ namespace {
bool VisitDeclRefExpr(DeclRefExpr *DRE);
bool VisitCXXThisExpr(CXXThisExpr *ThisE);
bool VisitLambdaExpr(LambdaExpr *Lambda);
bool VisitPseudoObjectExpr(PseudoObjectExpr *POE);
};
/// VisitExpr - Visit all of the children of this expression.
@ -115,6 +116,23 @@ namespace {
<< ThisE->getSourceRange();
}
bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(PseudoObjectExpr *POE) {
bool Invalid = false;
for (PseudoObjectExpr::semantics_iterator
i = POE->semantics_begin(), e = POE->semantics_end(); i != e; ++i) {
Expr *E = *i;
// Look through bindings.
if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
E = OVE->getSourceExpr();
assert(E && "pseudo-object binding without source expression?");
}
Invalid |= Visit(E);
}
return Invalid;
}
bool CheckDefaultArgumentVisitor::VisitLambdaExpr(LambdaExpr *Lambda) {
// C++11 [expr.lambda.prim]p13:
// A lambda-expression appearing in a default argument shall not

View File

@ -57,3 +57,21 @@ template<typename T> void f() {
}
template void f<int>();
// rdar://13602832
//
// Make sure that the default-argument checker looks through
// pseudo-object expressions correctly. The default argument
// needs to force l2r to test this effectively because the checker
// is syntactic and runs before placeholders are handled.
@interface Test13602832
- (int) x;
@end
namespace test13602832 {
template <int N> void foo(Test13602832 *a, int limit = a.x + N) {} // expected-error {{default argument references parameter 'a'}}
void test(Test13602832 *a) {
// FIXME: this is a useless cascade error.
foo<1024>(a); // expected-error {{no matching function}}
}
}