Commit 46812ec2 by Jason Merrill Committed by Jason Merrill

typeck2.c (store_init_value): Diagnose a non-constant initializer for in-class static.

	* typeck2.c (store_init_value): Diagnose a non-constant
	initializer for in-class static.

From-SVN: r200450
parent 447cf554
2013-06-21 Jason Merrill <jason@redhat.com> 2013-06-26 Jason Merrill <jason@redhat.com>
* typeck2.c (store_init_value): Diagnose a non-constant
initializer for in-class static.
PR c++/57408 PR c++/57408
* semantics.c (add_capture): Set type to error_mark_node after * semantics.c (add_capture): Set type to error_mark_node after
......
...@@ -6346,25 +6346,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -6346,25 +6346,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
cleanups = make_tree_vector (); cleanups = make_tree_vector ();
init = check_initializer (decl, init, flags, &cleanups); init = check_initializer (decl, init, flags, &cleanups);
/* Check that the initializer for a static data member was a
constant. Although we check in the parser that the
initializer is an integral constant expression, we do not
simplify division-by-zero at the point at which it
occurs. Therefore, in:
struct S { static const int i = 7 / 0; };
we issue an error at this point. It would
probably be better to forbid division by zero in
integral constant expressions. */
if (DECL_EXTERNAL (decl) && init)
{
error ("%qD cannot be initialized by a non-constant expression"
" when being declared", decl);
DECL_INITIALIZED_IN_CLASS_P (decl) = 0;
init = NULL_TREE;
}
/* Handle: /* Handle:
[dcl.init] [dcl.init]
......
...@@ -775,7 +775,8 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags) ...@@ -775,7 +775,8 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
bool const_init; bool const_init;
value = fold_non_dependent_expr (value); value = fold_non_dependent_expr (value);
value = maybe_constant_init (value); value = maybe_constant_init (value);
if (DECL_DECLARED_CONSTEXPR_P (decl)) if (DECL_DECLARED_CONSTEXPR_P (decl)
|| DECL_IN_AGGR_P (decl))
{ {
/* Diagnose a non-constant initializer for constexpr. */ /* Diagnose a non-constant initializer for constexpr. */
if (processing_template_decl if (processing_template_decl
......
template <long long i>
struct Fib
{
static const long long value // { dg-error "overflow" }
= Fib<i-1>::value + Fib<i-2>::value;
};
template <>
struct Fib<0>
{
static const long long value = 0;
};
template <>
struct Fib<1>
{
static const long long value = 1;
};
int main()
{
return Fib<95>::value;
}
...@@ -46,5 +46,6 @@ test02() ...@@ -46,5 +46,6 @@ test02()
// { dg-error "overflow in multiplication" "" { target *-*-* } 97 } // { dg-error "overflow in multiplication" "" { target *-*-* } 97 }
// { dg-error "overflow in multiplication" "" { target *-*-* } 99 } // { dg-error "overflow in multiplication" "" { target *-*-* } 99 }
// { dg-error "overflow in multiplication" "" { target *-*-* } 101 } // { dg-error "overflow in multiplication" "" { target *-*-* } 101 }
// { dg-error "overflow in constant expression" "" { target *-*-* } 108 }
// { dg-prune-output "out of range" } // { dg-prune-output "out of range" }
// { dg-prune-output "not usable in a constant expression" } // { dg-prune-output "not usable in a constant expression" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment