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

            Bug ID: 68679
           Summary: gcc-5.2.1 ICE in C++11 anon union of structs with
                    template fns, OK in gcc <= 4.9.3
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ejkruus at gmail dot com
  Target Milestone: ---

Created attachment 36899
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36899&action=edit
ICE in union of struct with functions, no-headers

The following code (also attached) causes an ICE in gcc-5.2.1,
but was acceptable for several gcc <= 4.9.3.
Keeping two of the three struct cases was often OK, but
adding third 'dimN' into the union seemed to always be a bad thing.

System:
Ubuntu 15.10, x86_64
cpu family      : 6
model           : 30
model name      : Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz

/////////////////// terminal

kruus@borg:~/w/milde$ g++ --version
g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

kruus@borg:~/w/milde$ gcc-5 -std=c++11 -c a.cpp -o a.o
a.cpp: In instantiation of ‘uint_least32_t Hdr::<anonymous union>::<anonymous
struct>::operator[](IDX) const [with IDX = unsigned int; uint_least32_t =
unsigned int]’:
a.cpp:27:32:   required from here
a.cpp:18:45: internal compiler error: in structural_comptypes, at
cp/typeck.c:1197
       template<typename IDX> uint_least32_t operator[](IDX const i) const {
                                             ^
...
kruus@borg:~/w/milde$ gcc-5 -std=c++11 -g -c a.cpp -o a.o
a.cpp: In instantiation of ‘uint_least32_t Hdr::<anonymous union>::<anonymous
struct>::operator[](IDX) const [with IDX = unsigned int; uint_least32_t =
unsigned int]’:
a.cpp:26:32:   required from here
a.cpp:14:45: sorry, unimplemented: use of ‘<invalid tree code>’ in template
       template<typename IDX> uint_least32_t operator[](IDX const i) const {
                                             ^

...
////////////////////// sample code

typedef unsigned u32;
typedef unsigned short u16;
typedef unsigned char u8;

typedef struct {
  union {
    // seems to work with two of them, but adding the third causes ICE?
    struct { u32 d[4];
      template<typename IDX> u32 operator[](IDX const i) const {
        return d[i]; }
    } dim0;
    struct { u16 d[8];
      template<typename IDX> u32 operator[](IDX const i) const {
        return d[i]; }
    } dim1;
    struct { u8  d[16];
      template<typename IDX> u32 operator[](IDX const i) const {
        return d[i]; }
    } dim2;
    /** \c dims(fmt,i) returns the \c i'th item of \c dims in format \c fmt */
    u32 operator()(u8 fmt, u32 idx) const {
      u32 ret=0U;
      switch(fmt){
        case(0): ret = dim0[idx]; break;
        case(1): ret = dim1[idx]; break;
        case(2): ret = dim2[idx]; break;
        default: ;
      }
      return ret;
    }
  } dims;
  u8  fmt;     ///< dimension encoding fmt
} Hdr;

int main(int,char**){ return 0; }

Reply via email to