diff options
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 16 | ||||
-rw-r--r-- | test/Sema/array-init.c | 14 |
2 files changed, 6 insertions, 24 deletions
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<DeclRefExpr>(Init)->getDecl(); if (isa<EnumConstantDecl>(D)) return false; - - if (const ValueDecl *VD = dyn_cast<ValueDecl>(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<CastExpr>(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<ConditionalOperator>(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}} |