+type_t *get_qualified_type(type_t *orig_type, type_qualifiers_t const qual)
+{
+ type_t *type = skip_typeref(orig_type);
+
+ type_t *copy;
+ if (is_type_array(type)) {
+ /* For array types the element type has to be adjusted */
+ type_t *element_type = type->array.element_type;
+ type_t *qual_element_type = get_qualified_type(element_type, qual);
+
+ if (qual_element_type == element_type)
+ return orig_type;
+
+ copy = duplicate_type(type);
+ copy->array.element_type = qual_element_type;
+ } else if (is_type_valid(type)) {
+ if ((type->base.qualifiers & qual) == qual)
+ return orig_type;
+
+ copy = duplicate_type(type);
+ copy->base.qualifiers |= qual;
+ } else {
+ return type;
+ }
+
+ type = typehash_insert(copy);
+ if (type != copy)
+ obstack_free(type_obst, copy);
+
+ return type;
+}
+