From: Eli Friedman Date: Mon, 1 Sep 2008 22:08:17 +0000 (+0000) Subject: Backing out r55607 due to logic errors and test regression. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6d4abe1eee550411524ca002025fdf0490eefd26;p=clang Backing out r55607 due to logic errors and test regression. I'll try to come up with a correct fix for the testcase sometime soon. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55614 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d93a5eca5f..7e60da5af3 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1076,13 +1076,6 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { const Decl *D = cast(Init)->getDecl(); if (isa(D)) return false; - - if (const ValueDecl *VD = dyn_cast(D)) { - QualType Ty = VD->getType(); - if (Ty->isPointerLikeType() || Ty->isArrayType()) - return false; - } - Diag(Init->getExprLoc(), diag::err_init_element_not_constant, Init->getSourceRange()); return true; @@ -1105,8 +1098,6 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { Diag(Init->getExprLoc(), diag::err_init_element_not_constant, Init->getSourceRange()); return true; - case UnaryOperator::AddrOf: - return false; case UnaryOperator::SizeOf: case UnaryOperator::AlignOf: case UnaryOperator::OffsetOf: @@ -1169,7 +1160,12 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { case Expr::ImplicitCastExprClass: case Expr::ExplicitCastExprClass: { const Expr *SubExpr = cast(Init)->getSubExpr(); - return CheckArithmeticConstantExpression(SubExpr); + if (SubExpr->getType()->isArithmeticType()) + return CheckArithmeticConstantExpression(SubExpr); + + Diag(Init->getExprLoc(), + diag::err_init_element_not_constant, Init->getSourceRange()); + return true; } case Expr::ConditionalOperatorClass: { const ConditionalOperator *Exp = cast(Init); diff --git a/test/Sema/array-init.c b/test/Sema/array-init.c index bf3d83d265..6494b9593e 100644 --- a/test/Sema/array-init.c +++ b/test/Sema/array-init.c @@ -222,19 +222,5 @@ struct {int:5;} x[] = {6}; //expected-error{{initializer for aggregate with no e struct {int a; int:5;} noNamedImplicit[] = {1,2,3}; int noNamedImplicitCheck[sizeof(noNamedImplicit) == 3 * sizeof(*noNamedImplicit) ? 1 : -1]; - -// ptrs are constant -struct soft_segment_descriptor { - int ssd_base; -}; -static int dblfault_tss; - -union uniao { int ola; } xpto[1]; - -struct soft_segment_descriptor gdt_segs[] = { - {(int) &dblfault_tss}, - { (int)xpto}, -}; - static void sppp_ipv6cp_up(); const struct {} ipcp = { sppp_ipv6cp_up }; //expected-warning{{empty struct extension}} expected-warning{{excess elements in array initializer}}