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

            Bug ID: 83928
           Summary: implicit conversion of literal class type to unscoped
                    enumeration can not be used as array size
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: smw at gcc dot gnu.org
  Target Milestone: ---

[expr.const]/6 says "If an expression of literal class type is used in a
context where an integral constant expression is required, then that expression
is contextually implicitly converted (Clause 4) to an integral or unscoped
enumeration type and the selected conversion function shall be constexpr."

That works great, except when trying to use that constexpr value in an array
declaration.

A code example speaks louder than tortured English can scream.


  // Case 1: literal class type with implicit coversion to integral expression
  struct LiteralClassTypeInt
  {
    constexpr LiteralClassTypeInt(int i) : val(i) { }
    constexpr operator int() const { return val; }
  private:
    int val;
  };

  template<int> struct X { };

  constexpr LiteralClassTypeInt lct_int = 42;
  X<lct_int> x_int;       // OK: implicit conversion to integral expression
  int int_index[lct_int]; // OK: implicitly converted to integral expression

  // Case 2: Unscoped enumeration
  enum E { three = 3 };
  int eee[three]; // OK: unscoped enumeration is allowed here

  // Case 3: literal class type with implicit conversion to unscoped enum
  struct LiteralClassTypeEnum
  {
    constexpr LiteralClassTypeEnum(E e): val(e) { }
    constexpr operator E() const { return val; }
  private:
    E val;
  };

  constexpr LiteralClassTypeEnum lct_enum(three);
  X<lct_enum> x_enum;       // OK!
  int enum_index[lct_enum]; // buggerit

All of ICC, LLVM, and MSVC accept the above code as-is.  GCC (all versions
tested up to and including 8.0.1 20120117 (experimental)) give the following
error.

32 : <source>:32:24: error: size of array 'enum_index' has non-integral type
'const LiteralClassTypeEnum'
 int enum_index[lct_enum]; // buggerit
                        ^
Compiler returned: 1

Reply via email to