aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2025-02-13 15:56:16 -0500
committerMarek Polacek <polacek@redhat.com>2025-02-14 08:08:53 -0500
commitb01664a6197f57615d3c62594037c575dfdd9035 (patch)
tree2d22f44449a8cd7c1134b653190aef0f6906d7f5 /gcc
parent74ea20e16cf18b42071557b71a42ea31c8192425 (diff)
downloadgcc-b01664a6197f57615d3c62594037c575dfdd9035.zip
gcc-b01664a6197f57615d3c62594037c575dfdd9035.tar.gz
gcc-b01664a6197f57615d3c62594037c575dfdd9035.tar.bz2
c++: fix propagating REF_PARENTHESIZED_P [PR116379]
Here we have: template<typename T> struct X{ T val; decltype(auto) value(){ return (val); } }; where the return type of value should be 'int &' since '(val)' is an expression, not a name, and decltype(auto) performs the type deduction using the decltype rules. The problem is that we weren't propagating REF_PARENTHESIZED_P correctly: the return value of finish_non_static_data_member in this test was a REFERENCE_REF_P, so we didn't set the flag. We should use force_paren_expr like below. PR c++/116379 gcc/cp/ChangeLog: * pt.cc (tsubst_expr) <COMPONENT_REF>: Use force_paren_expr to set REF_PARENTHESIZED_P. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/decltype-auto9.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/pt.cc4
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C15
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index a2fc881..5706a39 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -21712,8 +21712,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{
r = finish_non_static_data_member (member, object, NULL_TREE,
complain);
- if (TREE_CODE (r) == COMPONENT_REF)
- REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
+ if (REF_PARENTHESIZED_P (t))
+ force_paren_expr (r);
RETURN (r);
}
else if (type_dependent_expression_p (object))
diff --git a/gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C b/gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C
new file mode 100644
index 0000000..1ccf95a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C
@@ -0,0 +1,15 @@
+// PR c++/116379
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+struct X {
+ T val;
+ decltype(auto) value() { return (val); }
+};
+
+int main() {
+ int i = 0;
+ X<int&&> x{ static_cast<int&&>(i) };
+ using type = decltype(x.value());
+ using type = int&;
+}