diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2016-03-12 02:05:17 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2016-03-12 02:05:17 +0000 |
commit | 3f1e5d3afe4d01a277747fe74fc01859139576ca (patch) | |
tree | 7b8e32914e63bd23bcc66a087cddb1cb38304ba9 /gcc | |
parent | c1e884652647c950afed64c13d66d55f40100244 (diff) | |
download | gcc-3f1e5d3afe4d01a277747fe74fc01859139576ca.zip gcc-3f1e5d3afe4d01a277747fe74fc01859139576ca.tar.gz gcc-3f1e5d3afe4d01a277747fe74fc01859139576ca.tar.bz2 |
Fix PR c++/70106 (type of parenthesized qualified-id has wrong cv-qualifiers)
gcc/cp/ChangeLog:
PR c++/70106
* semantics.c (force_paren_expr): Just build a PAREN_EXPR when
processing_template_decl and EXPR is a SCOPE_REF.
gcc/testsuite/ChangeLog:
PR c++/70106
* g++.dg/cpp1y/paren3.C: New test.
From-SVN: r234159
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/paren3.C | 30 |
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 46174cc..94e4427 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-03-12 Patrick Palka <ppalka@gcc.gnu.org> + + PR c++/70106 + * semantics.c (force_paren_expr): Just build a PAREN_EXPR when + processing_template_decl and EXPR is a SCOPE_REF. + 2016-03-10 Patrick Palka <ppalka@gcc.gnu.org> Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fd83c46..1574e60 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1649,7 +1649,15 @@ force_paren_expr (tree expr) if (TREE_CODE (expr) == COMPONENT_REF) REF_PARENTHESIZED_P (expr) = true; - else if (type_dependent_expression_p (expr)) + else if (type_dependent_expression_p (expr) + /* When processing_template_decl, a SCOPE_REF may actually be + referring to a non-static data member of the current class, in + which case its TREE_TYPE may not be properly cv-qualified (the + cv-qualifiers of the implicit *this object haven't yet been taken + into account) so we have to delay building a static_cast until + instantiation. */ + || (processing_template_decl + && TREE_CODE (expr) == SCOPE_REF)) expr = build1 (PAREN_EXPR, TREE_TYPE (expr), expr); else if (VAR_P (expr) && DECL_HARD_REGISTER (expr)) /* We can't bind a hard register variable to a reference. */; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a2eac07..515dbc7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-03-12 Patrick Palka <ppalka@gcc.gnu.org> + + PR c++/70106 + * g++.dg/cpp1y/paren3.C: New test. + 2016-03-11 Michael Meissner <meissner@linux.vnet.ibm.com> PR target/70131 diff --git a/gcc/testsuite/g++.dg/cpp1y/paren3.C b/gcc/testsuite/g++.dg/cpp1y/paren3.C new file mode 100644 index 0000000..850be2c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/paren3.C @@ -0,0 +1,30 @@ +// PR c++/70106 +// { dg-do compile { target c++14 } } + +template <typename> +struct A +{ + int x; + + void foo () const { + (A::x); + } +}; + +struct B +{ + int x; + + template <typename> + void foo () const { + (B::x); + } +}; + +void +foo () +{ + A<int> ().foo (); + B ().foo<int> (); +} + |