diff options
author | Patrick Palka <ppalka@redhat.com> | 2023-05-07 11:57:22 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2023-05-07 11:57:22 -0400 |
commit | e4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f (patch) | |
tree | 0264eb597869b38838f8783a5961cc2d346b034a /gcc | |
parent | 7bfb1550ccea7c426d50244e980f01f30db8ba0c (diff) | |
download | gcc-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.cc | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/paren6.C | 14 |
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&; |