https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83997
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Seems nothing actually handles the late attributes in TYPE_ATTRIBUTES that aren't {RECORD,UNION,CLASS,ENUMERAL}_TYPE. Tried: --- pt.c.jj5 2018-01-24 17:18:42.393392254 +0100 +++ pt.c 2018-01-26 14:12:46.470745138 +0100 @@ -13662,18 +13662,43 @@ tsubst (tree t, tree args, tsubst_flags_ case ERROR_MARK: case IDENTIFIER_NODE: case VOID_TYPE: + case LANG_TYPE: + return t; + case REAL_TYPE: case COMPLEX_TYPE: case VECTOR_TYPE: case BOOLEAN_TYPE: case NULLPTR_TYPE: - case LANG_TYPE: + if (TYPE_ATTRIBUTES (t)) + { + tree orig_t = t; + tree attributes = TYPE_ATTRIBUTES (t); + TYPE_ATTRIBUTES (t) = NULL_TREE; + apply_late_template_attributes (&t, attributes, 0, + args, complain, NULL_TREE); + if (t != orig_t) + TYPE_ATTRIBUTES (orig_t) = attributes; + fixup_attribute_variants (t); + } return t; case INTEGER_TYPE: if (t == integer_type_node) return t; + if (TYPE_ATTRIBUTES (t)) + { + tree orig_t = t; + tree attributes = TYPE_ATTRIBUTES (t); + TYPE_ATTRIBUTES (t) = NULL_TREE; + apply_late_template_attributes (&t, attributes, 0, + args, complain, NULL_TREE); + if (t != orig_t) + TYPE_ATTRIBUTES (orig_t) = attributes; + fixup_attribute_variants (t); + } + if (TREE_CODE (TYPE_MIN_VALUE (t)) == INTEGER_CST && TREE_CODE (TYPE_MAX_VALUE (t)) == INTEGER_CST) return t; but even that is already ugly hack, but would need to deal with t becoming something else after the apply_late_template_attributes call (VECTOR_TYPE in this case).