]> granicus.if.org Git - clang/commitdiff
Check for placeholders early on in
authorDouglas Gregor <dgregor@apple.com>
Wed, 22 Jun 2011 23:21:00 +0000 (23:21 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 22 Jun 2011 23:21:00 +0000 (23:21 +0000)
Sema::CreateUnaryExprOrTypeTraitExpr() rather than recursing in some
cases. Fixes <rdar://problem/9659191>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133663 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/SemaCXX/alignof-sizeof-reference.cpp

index e4eb95379d76281f5b6d436d83b28678612f1d85..8914bf38351d062304863702eed088e705f4b6a5 100644 (file)
@@ -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);
   }
index b517e43cf1ffd3f60c138670c2c2b72c958e4b02..93ba203ae112ed5f232611a27d128f80dfdb74aa 100644 (file)
@@ -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<typename T> void f_template(); // expected-note{{candidate function}}
+template<typename T> void f_template(T*); // expected-note{{candidate function}}
+void rdar9659191() {
+  (void)alignof(f_template<int>); // expected-error{{cannot resolve overloaded function 'f_template' from context}}
+}