aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2023-05-07 11:57:22 -0400
committerPatrick Palka <ppalka@redhat.com>2023-05-07 11:57:22 -0400
commite4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f (patch)
tree0264eb597869b38838f8783a5961cc2d346b034a /gcc
parent7bfb1550ccea7c426d50244e980f01f30db8ba0c (diff)
downloadgcc-e4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f.zip
gcc-e4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f.tar.gz
gcc-e4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f.tar.bz2
c++: parenthesized -> resolving to static data member [PR98283]
Here we're neglecting to propagate parenthesized-ness when the member access (this->m) resolves to a static data member (and thus finish_class_member_access_expr yields a VAR_DECL instead of a COMPONENT_REF). PR c++/98283 gcc/cp/ChangeLog: * pt.cc (tsubst_copy_and_build) <case COMPONENT_REF>: Propagate REF_PARENTHESIZED_P more generally via force_paren_expr. * semantics.cc (force_paren_expr): Document default argument. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/paren6.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/pt.cc4
-rw-r--r--gcc/cp/semantics.cc2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/paren6.C14
3 files changed, 17 insertions, 3 deletions
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index ee4a2f3..de95e12 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -21520,8 +21520,8 @@ tsubst_copy_and_build (tree t,
r = finish_class_member_access_expr (object, member,
/*template_p=*/false,
complain);
- if (TREE_CODE (r) == COMPONENT_REF)
- REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
+ if (REF_PARENTHESIZED_P (t))
+ r = force_paren_expr (r);
RETURN (r);
}
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index 474da71..13c6582 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -2070,7 +2070,7 @@ finish_mem_initializers (tree mem_inits)
right result. If EVEN_UNEVAL, do this even in unevaluated context. */
tree
-force_paren_expr (tree expr, bool even_uneval)
+force_paren_expr (tree expr, bool even_uneval /* = false */)
{
/* This is only needed for decltype(auto) in C++14. */
if (cxx_dialect < cxx14)
diff --git a/gcc/testsuite/g++.dg/cpp1y/paren6.C b/gcc/testsuite/g++.dg/cpp1y/paren6.C
new file mode 100644
index 0000000..812a99c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/paren6.C
@@ -0,0 +1,14 @@
+// PR c++/98283
+// { dg-do compile { target c++14 } }
+
+struct A {
+ static int m;
+};
+
+template<class T>
+struct B : T {
+ decltype(auto) f() { return (this->m); }
+};
+
+using type = decltype(B<A>().f());
+using type = int&;