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:
parent
f33e4dd77a
commit
36c37128fe
5 changed files with 26 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue