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:
parent
c1e8846526
commit
3f1e5d3afe
@ -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>
|
||||
|
||||
|
@ -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. */;
|
||||
|
@ -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
|
||||
|
30
gcc/testsuite/g++.dg/cpp1y/paren3.C
Normal file
30
gcc/testsuite/g++.dg/cpp1y/paren3.C
Normal 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> ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user