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
This commit is contained in:
Patrick Palka 2016-03-12 02:05:17 +00:00
parent c1e8846526
commit 3f1e5d3afe
4 changed files with 50 additions and 1 deletions

View File

@ -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>

View File

@ -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. */;

View File

@ -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

View File

@ -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> ();
}