From: Nuno Lopes Date: Mon, 1 Sep 2008 14:47:06 +0000 (+0000) Subject: make CheckArithmeticConstantExpression() aware of &foo and pointers X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f7e37ce8400d5ba3b0613116034aaa30e6a70b3e;p=clang make CheckArithmeticConstantExpression() aware of &foo and pointers git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55607 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 599f0ba61b..bf7c690ac2 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1076,6 +1076,13 @@ 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; @@ -1098,6 +1105,8 @@ 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: @@ -1160,12 +1169,7 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { case Expr::ImplicitCastExprClass: case Expr::ExplicitCastExprClass: { const Expr *SubExpr = cast(Init)->getSubExpr(); - if (SubExpr->getType()->isArithmeticType()) - return CheckArithmeticConstantExpression(SubExpr); - - Diag(Init->getExprLoc(), - diag::err_init_element_not_constant, Init->getSourceRange()); - return true; + return CheckArithmeticConstantExpression(SubExpr); } case Expr::ConditionalOperatorClass: { const ConditionalOperator *Exp = cast(Init); diff --git a/test/Sema/array-init.c b/test/Sema/array-init.c index 24a0070c1f..7d6e6c6d28 100644 --- a/test/Sema/array-init.c +++ b/test/Sema/array-init.c @@ -222,3 +222,16 @@ 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}, +};