Commit 5b93b053 by Jason Merrill Committed by Jason Merrill

Fix handling of namespace-scope undeduced auto decls.

	* decl2.c (decl_dependent_p): New.
	(mark_used): Check it instead of just processing_template_decl.

From-SVN: r274894
parent 01c53a74
2019-08-22 Jason Merrill <jason@redhat.com> 2019-08-22 Jason Merrill <jason@redhat.com>
* decl2.c (decl_dependent_p): New.
(mark_used): Check it instead of just processing_template_decl.
2019-08-22 Jason Merrill <jason@redhat.com>
* parser.c (cp_parser_nested_name_specifier_opt): Avoid redundant * parser.c (cp_parser_nested_name_specifier_opt): Avoid redundant
error. error.
......
...@@ -5425,6 +5425,25 @@ cp_warn_deprecated_use_scopes (tree scope) ...@@ -5425,6 +5425,25 @@ cp_warn_deprecated_use_scopes (tree scope)
} }
} }
/* True if DECL or its enclosing scope have unbound template parameters. */
bool
decl_dependent_p (tree decl)
{
if (DECL_FUNCTION_SCOPE_P (decl)
|| TREE_CODE (decl) == CONST_DECL
|| TREE_CODE (decl) == USING_DECL
|| TREE_CODE (decl) == FIELD_DECL)
decl = CP_DECL_CONTEXT (decl);
if (tree tinfo = get_template_info (decl))
if (any_dependent_template_arguments_p (TI_ARGS (tinfo)))
return true;
if (LAMBDA_FUNCTION_P (decl)
&& dependent_type_p (DECL_CONTEXT (decl)))
return true;
return false;
}
/* Mark DECL (either a _DECL or a BASELINK) as "used" in the program. /* Mark DECL (either a _DECL or a BASELINK) as "used" in the program.
If DECL is a specialization or implicitly declared class member, If DECL is a specialization or implicitly declared class member,
generate the actual definition. Return false if something goes generate the actual definition. Return false if something goes
...@@ -5451,6 +5470,9 @@ mark_used (tree decl, tsubst_flags_t complain) ...@@ -5451,6 +5470,9 @@ mark_used (tree decl, tsubst_flags_t complain)
decl = OVL_FIRST (decl); decl = OVL_FIRST (decl);
} }
if (!DECL_P (decl))
return true;
/* Set TREE_USED for the benefit of -Wunused. */ /* Set TREE_USED for the benefit of -Wunused. */
TREE_USED (decl) = 1; TREE_USED (decl) = 1;
/* And for structured bindings also the underlying decl. */ /* And for structured bindings also the underlying decl. */
...@@ -5498,7 +5520,7 @@ mark_used (tree decl, tsubst_flags_t complain) ...@@ -5498,7 +5520,7 @@ mark_used (tree decl, tsubst_flags_t complain)
|| DECL_LANG_SPECIFIC (decl) == NULL || DECL_LANG_SPECIFIC (decl) == NULL
|| DECL_THUNK_P (decl)) || DECL_THUNK_P (decl))
{ {
if (!processing_template_decl if (!decl_dependent_p (decl)
&& !require_deduced_type (decl, complain)) && !require_deduced_type (decl, complain))
return false; return false;
return true; return true;
......
// { dg-do compile { target c++17 } }
auto fn = [](auto i) {
if constexpr (sizeof(i) == 1)
return fn(123); // { dg-error "auto" }
};
int main() {
fn('!');
}
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