2017-12-12 Jason Merrill <jason@redhat.com>
+ * decl.c (value_dependent_init_p): Check the type of a CONSTRUCTOR.
+ (type_dependent_init_p): Remove.
+
PR c++/82115 - ICE with variable initialized with its own address.
* cp-tree.h (struct lang_decl_base): Add dependent_init_p.
(DECL_DEPENDENT_INIT_P, SET_DECL_DEPENDENT_INIT_P): New.
make_rtl_for_nonlocal_decl (decl, init, /*asmspec=*/NULL);
}
-/* INIT is the initializer for a variable, as represented by the
- parser. Returns true iff INIT is type-dependent. */
-
-static bool
-type_dependent_init_p (tree init)
-{
- if (TREE_CODE (init) == TREE_LIST)
- /* A parenthesized initializer, e.g.: int i (3, 2); ? */
- return any_type_dependent_elements_p (init);
- else if (TREE_CODE (init) == CONSTRUCTOR)
- /* A brace-enclosed initializer, e.g.: int i = { 3 }; ? */
- {
- if (dependent_type_p (TREE_TYPE (init)))
- return true;
-
- vec<constructor_elt, va_gc> *elts;
- size_t nelts;
- size_t i;
-
- elts = CONSTRUCTOR_ELTS (init);
- nelts = vec_safe_length (elts);
- for (i = 0; i < nelts; ++i)
- if (type_dependent_init_p ((*elts)[i].value))
- return true;
- }
- else
- /* It must be a simple expression, e.g., int i = 3; */
- return type_dependent_expression_p (init);
-
- return false;
-}
-
/* INIT is the initializer for a variable, as represented by the
parser. Returns true iff INIT is value-dependent. */
else if (TREE_CODE (init) == CONSTRUCTOR)
/* A brace-enclosed initializer, e.g.: int i = { 3 }; ? */
{
+ if (dependent_type_p (TREE_TYPE (init)))
+ return true;
+
vec<constructor_elt, va_gc> *elts;
size_t nelts;
size_t i;
&& init_const_expr_p
&& TREE_CODE (type) != REFERENCE_TYPE
&& decl_maybe_constant_var_p (decl)
- && !(dep_init = (type_dependent_init_p (init)
- || value_dependent_init_p (init))))
+ && !(dep_init = value_dependent_init_p (init)))
{
/* This variable seems to be a non-dependent constant, so process
its initializer. If check_initializer returns non-null the