[Bug lto/83997] ICE with alias template and attribute
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jan 26 13:23:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83997
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jason at gcc dot gnu.org
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
With
--- pt.c.jj 2018-01-24 17:18:42.393392254 +0100
+++ pt.c 2018-01-26 14:21:07.285737403 +0100
@@ -13662,18 +13662,45 @@ 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 (t) != INTEGER_TYPE)
+ return t;
+ }
+
if (TREE_CODE (TYPE_MIN_VALUE (t)) == INTEGER_CST
&& TREE_CODE (TYPE_MAX_VALUE (t)) == INTEGER_CST)
return t;
we don't ICE during tsubst anymore and actually get what I expect at least for
variable sizes and foo/bar/baz function code on:
template<int N>
using T = int __attribute__((vector_size (sizeof(int) * N)));
template<int N>
struct S
{
typedef int type __attribute__((vector_size (sizeof(int) * N)));
};
T<4> q;
template<int N>
int r __attribute__((vector_size (sizeof(int) * N)));
void *s = &r<4>;
S<4>::type t;
T<4>
foo (T<4> a)
{
return a + 1;
}
decltype (r<4>)
bar (decltype (r<4>) a)
{
return a + 1;
}
S<4>::type
baz (S<4>::type a)
{
return a + 1;
}
but with -flto we still ICE. I'm afraid I must give up.
More information about the Gcc-bugs
mailing list