Possible C++11 regression: member of literal type breaks constexpr

Lukas Jirkovsky l.jirkovsky@gmail.com
Thu Jun 12 00:31:00 GMT 2014


Hello,
I think hit a regression in gcc 4.9.0 when using a static constexpr
member as a template parameter when used in a certain way. However, as
the problem is a bit more complex wanted to ask whether this truly is
a bug in gcc and not on my side before reporting it to bugtracker.

The problematic code is at the end of this mail (everything after CODE section).

When compiled with gcc 4.9.0, the
ValueTypeInfo<ValueTypeEnum::doubleval> v; in the FillFunctor
constructor gives an error:

    bug2.cpp: In constructor ‘FillFunctor<Format>::FillFunctor()’:
    bug2.cpp:24:41:   in constexpr expansion of ‘const
ValueType{1}->ValueType::operator int()’
    bug2.cpp:24:41: error: ‘*(const ValueType*)this’ is not a constant
expression
       ValueTypeInfo<ValueTypeEnum::doubleval> v;
            ^
    bug2.cpp:24:41: note: in template argument for type ‘int’
    bug2.cpp:24:44: error: invalid type in declaration before ‘;’ token
       ValueTypeInfo<ValueTypeEnum::doubleval> v;


However, the same expression compiles just fine if its used in a
function, such as main(). Removing m_ID makes the code compile, too.
Also, the compilation works after replacing:

  ValueTypeInfo<ValueTypeEnum::doubleval> v;

with a:

  constexpr ValueType doubleval = ValueType(1);
  ValueTypeInfo<doubleval> v;


Best wishes,
Lukas

CODE
#####

class ValueType {
public:
    constexpr operator int() const {return m_ID;};
    constexpr ValueType(const int v)
        : m_ID(v) {}
private:
    int m_ID;
};

class ValueTypeEnum {
public:
    static constexpr ValueType doubleval = ValueType(1);
};

template <int format>
class ValueTypeInfo {
};

template <typename Format>
class FillFunctor {
public:
    FillFunctor() {
        ValueTypeInfo<ValueTypeEnum::doubleval> v;
    }
};

int main() {
    ValueTypeInfo<ValueTypeEnum::doubleval> v;
}



More information about the Gcc-help mailing list