aboutsummaryrefslogtreecommitdiff
path: root/libcc1
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-02-09 22:23:25 -0500
committerPatrick Palka <ppalka@redhat.com>2020-02-10 20:43:53 -0500
commita6ee556c7659877bb59b719f11ca2153e86ded59 (patch)
tree68715d97e842e051dda449c38fea6fe51d98be16 /libcc1
parent91f4fc40bcf666eb57d566198981dc8e8eff9ccb (diff)
c++: Fix return type deduction with an abbreviated function template
This patch fixes two issues with return type deduction in the presence of an abbreviated function template. The first issue (PR 69448) is that if a placeholder auto return type contains any modifiers such as & or *, then the abbreviated function template compensation in splice_late_return_type does not get performed for the underlying auto node, leading to incorrect return type deduction. This happens because splice_late_return_type does not consider that a placeholder auto return type might have modifiers. To fix this it seems we need to look through modifiers in the return type to obtain the location of the underlying auto node in order to replace it with the adjusted auto node. To that end this patch refactors the utility function find_type_usage to return a pointer to the matched tree, and uses it to find and replace the underlying auto node. The second issue (PR 80471) is that the AUTO_IS_DECLTYPE flag is not being preserved in splice_late_return_type when compensating for an abbreviated function template, leading to us treating a decltype(auto) return type as if it was an auto return type. Fixed by making make_auto_1 set the AUTO_IS_DECLTYPE flag whenever we're building a decltype(auto) node and adjusting callers appropriately. The test for PR 80471 is adjusted to expect the correct behavior. gcc/cp/ChangeLog: PR c++/69448 PR c++/80471 * type-utils.h (find_type_usage): Refactor to take a tree * and to return a tree *, and update documentation accordingly. * pt.c (make_auto_1): Set AUTO_IS_DECLTYPE when building a decltype(auto) node. (make_constrained_decltype_auto): No need to explicitly set AUTO_IS_DECLTYPE anymore. (splice_late_return_type): Use find_type_usage to find and replace a possibly nested auto node instead of using is_auto. Check test for is_auto into an assert when deciding whether to late_return_type. (type_uses_auto): Adjust the call to find_type_usage. * parser.c (cp_parser_decltype): No need to explicitly set AUTO_IS_DECLTYPE anymore. libcc1/ChangeLog: PR c++/69448 PR c++/80471 * libcp1plugin.cc (plugin_get_expr_type): No need to explicitly set AUTO_IS_DECLTYPE anymore. gcc/testsuite/ChangeLog: PR c++/69448 PR c++/80471 * g++.dg/concepts/abbrev3.C: New test. * g++.dg/cpp2a/concepts-pr80471.C: Adjust a static_assert to expect the correct behavior. * g++.dg/cpp0x/auto9.C: Adjust a dg-error directive.
Diffstat (limited to 'libcc1')
-rw-r--r--libcc1/ChangeLog7
-rw-r--r--libcc1/libcp1plugin.cc5
2 files changed, 8 insertions, 4 deletions
diff --git a/libcc1/ChangeLog b/libcc1/ChangeLog
index ff994596200..d80a0daab43 100644
--- a/libcc1/ChangeLog
+++ b/libcc1/ChangeLog
@@ -1,3 +1,10 @@
+2020-02-12 Patrick Palka <ppalka@redhat.com>
+
+ PR c++/69448
+ PR c++/80471
+ * libcp1plugin.cc (plugin_get_expr_type): No need to explicitly set
+ AUTO_IS_DECLTYPE anymore.
+
2020-01-07 Paolo Carlini <paolo.carlini@oracle.com>
* libcp1plugin.cc (plugin_build_new_expr): Update build_new call.
diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc
index b466b34bee3..00449f43b52 100644
--- a/libcc1/libcp1plugin.cc
+++ b/libcc1/libcp1plugin.cc
@@ -3343,10 +3343,7 @@ plugin_get_expr_type (cc1_plugin::connection *self,
if (op0)
type = TREE_TYPE (op0);
else
- {
- type = make_decltype_auto ();
- AUTO_IS_DECLTYPE (type) = true;
- }
+ type = make_decltype_auto ();
return convert_out (ctx->preserve (type));
}