Commit e43b28ae by Patrick Palka

c++: Abbreviated function template return type [PR92187]

When updating an auto return type of an abbreviated function template in
splice_late_return_type, we should also propagate PLACEHOLDER_TYPE_CONSTRAINTS
(and cv-qualifiers) of the original auto node.

gcc/cp/ChangeLog:

	PR c++/92187
	* pt.c (splice_late_return_type): Propagate cv-qualifiers and
	PLACEHOLDER_TYPE_CONSTRAINTS from the original auto node to the new one.

gcc/testsuite/ChangeLog:

	PR c++/92187
	* g++.dg/concepts/abbrev5.C: New test.
	* g++.dg/concepts/abbrev6.C: New test.
parent c5bac7d1
2020-04-18 Patrick Palka <ppalka@redhat.com>
PR c++/92187
* pt.c (splice_late_return_type): Propagate cv-qualifiers and
PLACEHOLDER_TYPE_CONSTRAINTS from the original auto node to the new one.
2020-04-17 Patrick Palka <ppalka@redhat.com> 2020-04-17 Patrick Palka <ppalka@redhat.com>
PR c++/94483 PR c++/94483
......
...@@ -29032,10 +29032,17 @@ splice_late_return_type (tree type, tree late_return_type) ...@@ -29032,10 +29032,17 @@ splice_late_return_type (tree type, tree late_return_type)
{ {
tree idx = get_template_parm_index (*auto_node); tree idx = get_template_parm_index (*auto_node);
if (TEMPLATE_PARM_LEVEL (idx) <= processing_template_decl) if (TEMPLATE_PARM_LEVEL (idx) <= processing_template_decl)
{
/* In an abbreviated function template we didn't know we were dealing /* In an abbreviated function template we didn't know we were dealing
with a function template when we saw the auto return type, so update with a function template when we saw the auto return type, so update
it to have the correct level. */ it to have the correct level. */
*auto_node = make_auto_1 (TYPE_IDENTIFIER (*auto_node), true); tree new_auto = make_auto_1 (TYPE_IDENTIFIER (*auto_node), false);
PLACEHOLDER_TYPE_CONSTRAINTS (new_auto)
= PLACEHOLDER_TYPE_CONSTRAINTS (*auto_node);
TYPE_CANONICAL (new_auto) = canonical_type_parameter (new_auto);
new_auto = cp_build_qualified_type (new_auto, TYPE_QUALS (*auto_node));
*auto_node = new_auto;
}
} }
return type; return type;
} }
......
2020-04-18 Patrick Palka <ppalka@redhat.com>
PR c++/92187
* g++.dg/concepts/abbrev5.C: New test.
* g++.dg/concepts/abbrev6.C: New test.
2020-04-17 Jeff Law <law@redhat.com> 2020-04-17 Jeff Law <law@redhat.com>
PR rtl-optimization/90275 PR rtl-optimization/90275
......
// PR c++/92187
// { dg-do compile { target concepts } }
template <typename>
concept C = false;
C auto f(auto)
{
return 42; // { dg-error "deduced return type" }
}
void foo()
{
f(0);
}
// { dg-do compile { target concepts } }
const auto &f(auto)
{
static int n;
return n;
}
void foo()
{
f(5) = 0; // { dg-error "read-only" }
}
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