diff options
author | Marek Polacek <polacek@redhat.com> | 2025-02-13 15:56:16 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2025-02-14 08:08:53 -0500 |
commit | b01664a6197f57615d3c62594037c575dfdd9035 (patch) | |
tree | 2d22f44449a8cd7c1134b653190aef0f6906d7f5 /gcc | |
parent | 74ea20e16cf18b42071557b71a42ea31c8192425 (diff) | |
download | gcc-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.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C | 15 |
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&; +} |