From 4f0845ec62d5fb8be5d07adc09c54944ab952e5c Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 22 Jun 2011 23:21:00 +0000 Subject: [PATCH] Check for placeholders early on in Sema::CreateUnaryExprOrTypeTraitExpr() rather than recursing in some cases. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133663 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 10 ++++++---- test/SemaCXX/alignof-sizeof-reference.cpp | 6 ++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index e4eb95379d..8914bf3835 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -3301,6 +3301,12 @@ Sema::CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo, ExprResult Sema::CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind) { + ExprResult PE = CheckPlaceholderExpr(E); + if (PE.isInvalid()) + return ExprError(); + + E = PE.get(); + // Verify that the operand is valid. bool isInvalid = false; if (E->isTypeDependent()) { @@ -3312,10 +3318,6 @@ Sema::CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc, } else if (E->getBitField()) { // C99 6.5.3.4p1. Diag(E->getExprLoc(), diag::err_sizeof_alignof_bitfield) << 0; isInvalid = true; - } else if (E->getType()->isPlaceholderType()) { - ExprResult PE = CheckPlaceholderExpr(E); - if (PE.isInvalid()) return ExprError(); - return CreateUnaryExprOrTypeTraitExpr(PE.take(), OpLoc, ExprKind); } else { isInvalid = CheckUnaryExprOrTypeTraitOperand(E, UETT_SizeOf); } diff --git a/test/SemaCXX/alignof-sizeof-reference.cpp b/test/SemaCXX/alignof-sizeof-reference.cpp index b517e43cf1..93ba203ae1 100644 --- a/test/SemaCXX/alignof-sizeof-reference.cpp +++ b/test/SemaCXX/alignof-sizeof-reference.cpp @@ -13,3 +13,9 @@ void f(int); // expected-note{{candidate function}} void g() { sizeof(&f); // expected-error{{cannot resolve overloaded function 'f' from context}} } + +template void f_template(); // expected-note{{candidate function}} +template void f_template(T*); // expected-note{{candidate function}} +void rdar9659191() { + (void)alignof(f_template); // expected-error{{cannot resolve overloaded function 'f_template' from context}} +} -- 2.40.0