Commit 683be2f7 by Jason Merrill Committed by Jason Merrill

decl.c (cp_finish_decl): Don't instantiate auto variable.

	* decl.c (cp_finish_decl): Don't instantiate auto variable.

	(check_static_variable_definition): Allow auto.
	* constexpr.c (ensure_literal_type_for_constexpr_object): Likewise.

From-SVN: r260150
parent 3a2e98ce
2018-05-09 Jason Merrill <jason@redhat.com> 2018-05-10 Jason Merrill <jason@redhat.com>
* decl.c (cp_finish_decl): Don't instantiate auto variable.
(check_static_variable_definition): Allow auto.
* constexpr.c (ensure_literal_type_for_constexpr_object): Likewise.
* cp-tree.h (DECL_CONSTRUCTOR_P): Use DECL_CXX_CONSTRUCTOR_P. * cp-tree.h (DECL_CONSTRUCTOR_P): Use DECL_CXX_CONSTRUCTOR_P.
(DECL_DESTRUCTOR_P): Use DECL_CXX_DESTRUCTOR_P. (DECL_DESTRUCTOR_P): Use DECL_CXX_DESTRUCTOR_P.
......
...@@ -91,6 +91,8 @@ ensure_literal_type_for_constexpr_object (tree decl) ...@@ -91,6 +91,8 @@ ensure_literal_type_for_constexpr_object (tree decl)
if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype))) if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype)))
/* Don't complain here, we'll complain about incompleteness /* Don't complain here, we'll complain about incompleteness
when we try to initialize the variable. */; when we try to initialize the variable. */;
else if (type_uses_auto (type))
/* We don't know the actual type yet. */;
else if (!literal_type_p (type)) else if (!literal_type_p (type))
{ {
if (DECL_DECLARED_CONSTEXPR_P (decl)) if (DECL_DECLARED_CONSTEXPR_P (decl))
......
...@@ -6803,24 +6803,18 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -6803,24 +6803,18 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
&& (DECL_INITIAL (decl) || init)) && (DECL_INITIAL (decl) || init))
DECL_INITIALIZED_IN_CLASS_P (decl) = 1; DECL_INITIALIZED_IN_CLASS_P (decl) = 1;
/* Do auto deduction unless decl is a function or an uninstantiated
template specialization. */
if (TREE_CODE (decl) != FUNCTION_DECL if (TREE_CODE (decl) != FUNCTION_DECL
&& !(init == NULL_TREE
&& DECL_LANG_SPECIFIC (decl)
&& DECL_TEMPLATE_INSTANTIATION (decl)
&& !DECL_TEMPLATE_INSTANTIATED (decl))
&& (auto_node = type_uses_auto (type))) && (auto_node = type_uses_auto (type)))
{ {
tree d_init; tree d_init;
if (init == NULL_TREE) if (init == NULL_TREE)
{ gcc_assert (CLASS_PLACEHOLDER_TEMPLATE (auto_node));
if (DECL_LANG_SPECIFIC (decl)
&& DECL_TEMPLATE_INSTANTIATION (decl)
&& !DECL_TEMPLATE_INSTANTIATED (decl))
{
/* init is null because we're deferring instantiating the
initializer until we need it. Well, we need it now. */
instantiate_decl (decl, /*defer_ok*/true, /*expl*/false);
return;
}
gcc_assert (CLASS_PLACEHOLDER_TEMPLATE (auto_node));
}
d_init = init; d_init = init;
if (d_init) if (d_init)
{ {
...@@ -9368,6 +9362,7 @@ check_static_variable_definition (tree decl, tree type) ...@@ -9368,6 +9362,7 @@ check_static_variable_definition (tree decl, tree type)
in check_initializer. Similarly for inline static data members. */ in check_initializer. Similarly for inline static data members. */
if (DECL_P (decl) if (DECL_P (decl)
&& (DECL_DECLARED_CONSTEXPR_P (decl) && (DECL_DECLARED_CONSTEXPR_P (decl)
|| undeduced_auto_decl (decl)
|| DECL_VAR_DECLARED_INLINE_P (decl))) || DECL_VAR_DECLARED_INLINE_P (decl)))
return 0; return 0;
else if (cxx_dialect >= cxx11 && !INTEGRAL_OR_ENUMERATION_TYPE_P (type)) else if (cxx_dialect >= cxx11 && !INTEGRAL_OR_ENUMERATION_TYPE_P (type))
......
// { dg-additional-options -std=c++17 }
template <class T>
struct A
{
static constexpr auto x = T::x;
};
struct B;
A<B> a;
struct B
{
static constexpr auto x = 42;
};
auto x = a.x;
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