https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116175

            Bug ID: 116175
           Summary: ICE with dependent format attribute
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

// { dg-do compile { target c++11 } }
// { dg-options "-Wformat" }

template <typename ...T>
int foo (T ...args, const char *fmt, ...)
[[gnu::format (printf, 1 + sizeof... (T), 2 + sizeof... (T))]];

int a = foo <> ("%d", 1);
int b = foo <int, int, int, int, int> (1, 2, 3, 4, 5, "%d", 1);
int c = foo <> ("%f", 1);       // { dg-warning "format '%f' expects argument
of type 'double', but argument 2 has type 'int'" }
int d = foo <int, int, int, int, int> (1, 2, 3, 4, 5, "%f", 1); // { dg-warning
"format '%f' expects argument of type 'double', but argument 7 has type 'int'"
}

ICEs because we never actually instantiate the dependent attribute.
attr-format4.C:8:16: warning: ‘format’ attribute argument 2 value ‘(1 +
sizeof... (T))’ is not an integer constant [-Wattributes]
    8 | int a = foo <> ("%d", 1);
      |         ~~~~~~~^~~~~~~~~
attr-format4.C:8:16: internal compiler error: in validate_constant, at
c-family/c-format.cc:323
0x2f8d8be internal_error(char const*, ...)
        ../../gcc/diagnostic-global-context.cc:491
0xf75faf fancy_abort(char const*, int, char const*)
        ../../gcc/diagnostic.cc:1755
0x841a88 validate_constant
        ../../gcc/c-family/c-format.cc:323
0x841a88 validate_constant
        ../../gcc/c-family/c-format.cc:311
0x12b6645 decode_format_attr
        ../../gcc/c-family/c-format.cc:376

Reply via email to