/* PR c++/87541 - ICE using a constant decl as an attribute alloc_size argument { dg-do compile } { dg-options "-O2 -Wall -Wno-array-bounds" } */ #define ALLOC_SIZE(N) __attribute__ ((alloc_size (N))) const int i1 = 1; ALLOC_SIZE (i1) void* fcst (int); void* call_fcst (void) { void *p = fcst (1); __builtin___memset_chk (p, 0, 2, __builtin_object_size (p, 1)); // { dg-warning "\\\[-Wstringop-overflow=" } return p; } enum { e1 = 1 }; ALLOC_SIZE (e1) void* fenum (int); void* call_fenum (void) { void *p = fenum (1); __builtin___memset_chk (p, 0, 2, __builtin_object_size (p, 1)); // { dg-warning "\\\[-Wstringop-overflow=" } return p; } template struct A { ALLOC_SIZE (T::N1) static void* ftemplarg_1 (int); ALLOC_SIZE (T::N2) static void* ftemplarg_2 (int); // { dg-warning "attribute argument value .2. exceeds the number of function parameters 1" } }; struct B { static const int N1 = 1; static const int N2 = 1; }; void* call_ftemplarg_1 (A *pa) { void *p = pa->ftemplarg_1 (1); __builtin___memset_chk (p, 0, 2, __builtin_object_size (p, 1)); // { dg-warning "\\\[-Wstringop-overflow=" } return p; } struct C { static const int N1 = 1; static const int N2 = 2; }; void* call_ftemplarg_2 (A *pa) { void *p = pa->ftemplarg_2 (1); __builtin___memset_chk (p, 0, 2, __builtin_object_size (p, 1)); return p; }