Commit 3f1e5d3a by Patrick Palka

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
parent c1e88465
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> 2016-03-10 Patrick Palka <ppalka@gcc.gnu.org>
Jakub Jelinek <jakub@redhat.com> Jakub Jelinek <jakub@redhat.com>
......
...@@ -1649,7 +1649,15 @@ force_paren_expr (tree expr) ...@@ -1649,7 +1649,15 @@ force_paren_expr (tree expr)
if (TREE_CODE (expr) == COMPONENT_REF) if (TREE_CODE (expr) == COMPONENT_REF)
REF_PARENTHESIZED_P (expr) = true; 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); expr = build1 (PAREN_EXPR, TREE_TYPE (expr), expr);
else if (VAR_P (expr) && DECL_HARD_REGISTER (expr)) else if (VAR_P (expr) && DECL_HARD_REGISTER (expr))
/* We can't bind a hard register variable to a reference. */; /* We can't bind a hard register variable to a reference. */;
......
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> 2016-03-11 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/70131 PR target/70131
......
// 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> ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment