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
This commit is contained in:
parent
447cf5546f
commit
46812ec24c
@ -1,4 +1,7 @@
|
||||
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
|
||||
* 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,
|
||||
cleanups = make_tree_vector ();
|
||||
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:
|
||||
|
||||
[dcl.init]
|
||||
|
@ -775,7 +775,8 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
|
||||
bool const_init;
|
||||
value = fold_non_dependent_expr (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. */
|
||||
if (processing_template_decl
|
||||
|
23
gcc/testsuite/g++.dg/cpp0x/overflow1.C
Normal file
23
gcc/testsuite/g++.dg/cpp0x/overflow1.C
Normal file
@ -0,0 +1,23 @@
|
||||
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()
|
||||
// { dg-error "overflow in multiplication" "" { target *-*-* } 97 }
|
||||
// { dg-error "overflow in multiplication" "" { target *-*-* } 99 }
|
||||
// { dg-error "overflow in multiplication" "" { target *-*-* } 101 }
|
||||
// { dg-error "overflow in constant expression" "" { target *-*-* } 108 }
|
||||
// { dg-prune-output "out of range" }
|
||||
// { dg-prune-output "not usable in a constant expression" }
|
||||
|
Loading…
Reference in New Issue
Block a user