forked from OSchip/llvm-project
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:
parent
8ccbc18efa
commit
7353c86a4e
|
@ -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
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue