warning (OPT_Wattributes,
"ignoring attributes applied to %qT after definition",
TYPE_MAIN_VARIANT (ttype));
- return lang_hooks.types.build_lang_qualified_type (ttype, NULL_TREE,
- quals);
+ return build_qualified_type (ttype, quals);
}
- tree mtype = NULL_TREE;
- if (otype != TYPE_MAIN_VARIANT (otype))
- mtype = TYPE_MAIN_VARIANT (otype);
- ttype = lang_hooks.types.build_lang_qualified_type (ttype, mtype,
- TYPE_UNQUALIFIED);
+ ttype = build_qualified_type (ttype, TYPE_UNQUALIFIED);
+ if (lang_hooks.types.copy_lang_qualifiers
+ && otype != TYPE_MAIN_VARIANT (otype))
+ ttype = (lang_hooks.types.copy_lang_qualifiers
+ (ttype, TYPE_MAIN_VARIANT (otype)));
tree dtype = ntype = build_distinct_type_copy (ttype);
else if (TYPE_CANONICAL (ntype) == ntype)
TYPE_CANONICAL (ntype) = TYPE_CANONICAL (ttype);
- if (otype != TYPE_MAIN_VARIANT (otype))
- mtype = otype;
- else
- mtype = NULL_TREE;
- ttype = lang_hooks.types.build_lang_qualified_type (ntype, mtype, quals);
+ ttype = build_qualified_type (ntype, quals);
+ if (lang_hooks.types.copy_lang_qualifiers
+ && otype != TYPE_MAIN_VARIANT (otype))
+ ttype = lang_hooks.types.copy_lang_qualifiers (ttype, otype);
}
else if (TYPE_QUALS (ttype) != quals)
- ttype = lang_hooks.types.build_lang_qualified_type (ttype, NULL_TREE,
- quals);
+ ttype = build_qualified_type (ttype, quals);
return ttype;
}
attr_access::array_as_string (tree type) const
{
std::string typstr;
- bool free_type = false;
if (type == error_mark_node)
return std::string ();
const int quals = TYPE_QUALS (type);
type = build_array_type (eltype, index_type);
- if (arat || TYPE_QUALS (type) != quals)
- {
- /* We create a new array type which is only used during
- printing. Can't use build_type_attribute_qual_variant
- because it might with some lang hooks e.g. try to push
- qualifiers to the element type, while for the printing
- this wants the element type qualifiers to be unmodified
- and ARRAY_TYPE qualifiers to be a copy of the pointer
- type qualifiers. Furthermore, a type with somtimes
- weird qualifiers or artificial attribute should be
- freed right after the use. */
- type = copy_node (type);
- if (arat)
- {
- TREE_CHAIN (arat) = TYPE_ATTRIBUTES (type);
- TYPE_ATTRIBUTES (type) = arat;
- }
- TYPE_READONLY (type) = (quals & TYPE_QUAL_CONST) != 0;
- TYPE_VOLATILE (type) = (quals & TYPE_QUAL_VOLATILE) != 0;
- TYPE_ATOMIC (type) = (quals & TYPE_QUAL_ATOMIC) != 0;
- TYPE_RESTRICT (type) = (quals & TYPE_QUAL_RESTRICT) != 0;
- TYPE_ADDR_SPACE (type) = DECODE_QUAL_ADDR_SPACE (quals);
- free_type = true;
- }
+ type = build_type_attribute_qual_variant (type, arat, quals);
}
/* Format the type using the current pretty printer. The generic tree
std::unique_ptr<pretty_printer> pp (global_dc->clone_printer ());
pp_printf (pp.get (), "%qT", type);
typstr = pp_formatted_text (pp.get ());
- if (free_type)
- ggc_free (type);
return typstr;
}
}
}
-/* Langhook for building qualified types. */
-
-tree
-c_build_lang_qualified_type (tree type, tree, int type_quals)
-{
- if (TREE_CODE (type) == ARRAY_TYPE)
- return c_build_qualified_type (type, type_quals);
- else
- return build_qualified_type (type, type_quals);
-}
-
bool
c_missing_noreturn_ok_p (tree decl)
{
#define LANG_HOOKS_PRINT_IDENTIFIER c_print_identifier
#undef LANG_HOOKS_TYPES_COMPATIBLE_P
#define LANG_HOOKS_TYPES_COMPATIBLE_P c_types_compatible_p
-#undef LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE
-#define LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE c_build_lang_qualified_type
#undef LANG_HOOKS_MISSING_NORETURN_OK_P
#define LANG_HOOKS_MISSING_NORETURN_OK_P c_missing_noreturn_ok_p
#undef LANG_HOOKS_BLOCK_MAY_FALLTHRU
/* in c-objc-common.cc */
extern bool c_objc_common_init (void);
-extern tree c_build_lang_qualified_type (tree, tree, int);
extern bool c_missing_noreturn_ok_p (tree);
extern bool c_warn_unused_global_decl (const_tree);
extern void c_initialize_diagnostics (diagnostics::context *);
cxx_simulate_builtin_function_decl
#undef LANG_HOOKS_TYPE_HASH_EQ
#define LANG_HOOKS_TYPE_HASH_EQ cxx_type_hash_eq
-#undef LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE
-#define LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE cxx_build_lang_qualified_type
+#undef LANG_HOOKS_COPY_LANG_QUALIFIERS
+#define LANG_HOOKS_COPY_LANG_QUALIFIERS cxx_copy_lang_qualifiers
#undef LANG_HOOKS_MISSING_NORETURN_OK_P
#define LANG_HOOKS_MISSING_NORETURN_OK_P cp_missing_noreturn_ok_p
#undef LANG_HOOKS_BLOCK_MAY_FALLTHRU
extern tree cxx_builtin_function (tree decl);
extern tree cxx_builtin_function_ext_scope (tree decl);
extern tree cxx_simulate_builtin_function_decl (tree);
-extern tree cxx_build_lang_qualified_type (tree, tree, int);
extern tree check_elaborated_type_specifier (enum tag_types, tree, bool);
extern void warn_extern_redeclared_static (tree, tree);
extern tree cxx_comdat_group (tree);
return cp_build_qualified_type (type, type_quals);
}
-/* Implementation of the build_lang_qualified_type langhook. */
-tree
-cxx_build_lang_qualified_type (tree type, tree otype, int type_quals)
-{
- /* Only handle ARRAY_TYPEs using cp_build_qualified_type, so that
- quals are pushed to the element type. That is needed for PR101312.
- For other types just keep using build_qualified_type with
- cxx_copy_lang_qualifiers if needed, otherwise we can run into
- issues with FUNCTION_TYPEs with cv-qualifier-seq vs. type-specifier,
- or REFERENCE_TYPE which will error on certain TYPE_QUALS. */
- if (TREE_CODE (type) == ARRAY_TYPE)
- return cp_build_qualified_type (type, type_quals);
- else
- {
- tree ret = build_qualified_type (type, type_quals);
- if (otype)
- ret = cxx_copy_lang_qualifiers (ret, otype);
- return ret;
- }
-}
-
\f
/* Make a variant of TYPE, qualified with the TYPE_QUALS. Handles
arrays correctly. In particular, if TYPE is an array of T's, and
extern void lhd_incomplete_type_error (location_t, const_tree, const_tree);
extern tree lhd_type_promotes_to (tree);
extern void lhd_register_builtin_type (tree, const char *);
-extern tree lhd_build_lang_qualified_type (tree, tree, int);
extern bool lhd_decl_ok_for_sibcall (const_tree);
extern size_t lhd_tree_size (enum tree_code);
extern HOST_WIDE_INT lhd_to_target_charset (HOST_WIDE_INT);
#define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
lhd_omp_firstprivatize_type_sizes
#define LANG_HOOKS_TYPE_HASH_EQ NULL
-#define LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE lhd_build_lang_qualified_type
+#define LANG_HOOKS_COPY_LANG_QUALIFIERS NULL
#define LANG_HOOKS_GET_ARRAY_DESCR_INFO NULL
#define LANG_HOOKS_GET_SUBRANGE_BOUNDS NULL
#define LANG_HOOKS_GET_TYPE_BIAS NULL
LANG_HOOKS_TYPE_MAX_SIZE, \
LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES, \
LANG_HOOKS_TYPE_HASH_EQ, \
- LANG_HOOKS_BUILD_LANG_QUALIFIED_TYPE, \
+ LANG_HOOKS_COPY_LANG_QUALIFIERS, \
LANG_HOOKS_GET_ARRAY_DESCR_INFO, \
LANG_HOOKS_GET_SUBRANGE_BOUNDS, \
LANG_HOOKS_GET_TYPE_BIAS, \
{
}
-/* Return a version of the TYPE, qualified as indicated by the
- TYPE_QUALS, if one exists. If no qualified version exists yet,
- creates it and returns it. */
-tree
-lhd_build_lang_qualified_type (tree type, tree ARG_UNUSED (otype),
- int type_quals)
-{
- return build_qualified_type (type, type_quals);
-}
-
/* Invalid use of an incomplete type. */
void
lhd_incomplete_type_error (location_t ARG_UNUSED (loc),
FUNCTION_TYPE or METHOD_TYPE. */
bool (*type_hash_eq) (const_tree, const_tree);
- /* Return a version of the TYPE, qualified as indicated by the
- TYPE_QUALS in a language-specific way, if one exists, otherwise create it.
- If OTYPE is non-NULL, copy extra language modifiers from it too. */
- tree (*build_lang_qualified_type) (tree, tree, int);
+ /* If non-NULL, return TYPE1 with any language-specific modifiers copied from
+ TYPE2. */
+ tree (*copy_lang_qualifiers) (const_tree, const_tree);
/* Return TRUE if TYPE uses a hidden descriptor and fills in information
for the debugger about the array bounds, strides, etc. */
+++ /dev/null
-/* PR c/101312 */
-/* { dg-do compile } */
-
-volatile int a[1] __attribute__((may_alias));
+++ /dev/null
-/* PR c/101312 */
-/* { dg-do compile } */
-/* { dg-options "-g" } */
-
-volatile int a[1] __attribute__((may_alias));