diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e6d696b0447..861835b383d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2009-11-12 Jason Merrill + + * 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 PR c++/42013 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index ca52bdf7597..f66a00948ae 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index ef18a6c1041..db2920450eb 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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; diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 5aea55e792f..9dae1843616 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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. */ diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 7cafc8ab224..de21c4381be 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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