typeck.c (cv_qualified_p): New fn.

* typeck.c (cv_qualified_p): New fn.
	(decay_conversion): Use it.
	* cp-tree.h: Declare it.
	* tree.c (rvalue): Use it and cv_unqualified.
	* init.c (build_aggr_init): Likewise.

From-SVN: r154125
This commit is contained in:
Jason Merrill 2009-11-12 13:25:51 -05:00 committed by Jason Merrill
parent f33e4dd77a
commit 36c37128fe
5 changed files with 26 additions and 8 deletions

View File

@ -1,3 +1,11 @@
2009-11-12 Jason Merrill <jason@redhat.com>
* typeck.c (cv_qualified_p): New fn.
(decay_conversion): Use it.
* cp-tree.h: Declare it.
* tree.c (rvalue): Use it and cv_unqualified.
* init.c (build_aggr_init): Likewise.
2009-11-12 Jason Merrill <jason@redhat.com>
PR c++/42013

View File

@ -5149,6 +5149,7 @@ extern tree move (tree);
extern tree cp_build_qualified_type_real (tree, int, tsubst_flags_t);
#define cp_build_qualified_type(TYPE, QUALS) \
cp_build_qualified_type_real ((TYPE), (QUALS), tf_warning_or_error)
extern bool cv_qualified_p (const_tree);
extern tree cv_unqualified (tree);
extern special_function_kind special_function_p (const_tree);
extern int count_trees (tree);

View File

@ -1248,13 +1248,13 @@ build_aggr_init (tree exp, tree init, int flags, tsubst_flags_t complain)
/* Must arrange to initialize each element of EXP
from elements of INIT. */
itype = init ? TREE_TYPE (init) : NULL_TREE;
if (cp_type_quals (type) != TYPE_UNQUALIFIED)
TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type);
if (itype && cp_type_quals (itype) != TYPE_UNQUALIFIED)
itype = TREE_TYPE (init) = TYPE_MAIN_VARIANT (itype);
if (cv_qualified_p (type))
TREE_TYPE (exp) = cv_unqualified (type);
if (itype && cv_qualified_p (itype))
TREE_TYPE (init) = cv_unqualified (itype);
stmt_expr = build_vec_init (exp, NULL_TREE, init,
/*explicit_value_init_p=*/false,
itype && same_type_p (itype,
itype && same_type_p (TREE_TYPE (init),
TREE_TYPE (exp)),
complain);
TREE_READONLY (exp) = was_const;

View File

@ -555,8 +555,8 @@ rvalue (tree expr)
Non-class rvalues always have cv-unqualified types. */
type = TREE_TYPE (expr);
if (!CLASS_TYPE_P (type) && cp_type_quals (type))
type = cp_build_qualified_type (type, TYPE_UNQUALIFIED);
if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
type = cv_unqualified (type);
/* We need to do this for rvalue refs as well to get the right answer
from decltype; see c++/36628. */

View File

@ -1690,7 +1690,7 @@ decay_conversion (tree exp)
Non-class rvalues always have cv-unqualified types. */
type = TREE_TYPE (exp);
if (!CLASS_TYPE_P (type) && cp_type_quals (type))
if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
exp = build_nop (cv_unqualified (type), exp);
return exp;
@ -7411,6 +7411,15 @@ cp_type_readonly (const_tree type)
return TYPE_READONLY (type);
}
/* Returns nonzero if TYPE is const or volatile. */
bool
cv_qualified_p (const_tree type)
{
int quals = cp_type_quals (type);
return (quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE)) != 0;
}
/* Returns nonzero if the TYPE contains a mutable member. */
bool