[Bug c++/61556] New: [c++11][regression] ‘*?=(const ValueType*)=?UTF-8?Q?this’ is not a constant expression with valid code

l.jirkovsky at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Jun 18 22:20:00 GMT 2014


            Bug ID: 61556
           Summary: [c++11][regression] ‘*(const ValueType*)this’ is not a
                    constant expression with valid code
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: l.jirkovsky at gmail dot com

When used in a certain way, a template class cannot be instantiated in another
template class using a static constexpr. I tracked the regression down to the
following commit:

commit 18619da58c77461642c36cee9f0463c968877f75
Author: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Mon Apr 1 19:05:12 2013 +0000

        * call.c (add_function_candidate): Take the address of 'this' here.
        (build_over_call): And here.
        (build_new_method_call_1, build_op_call_1): Not here.
        (build_user_type_conversion_1): Or here.
        (add_candidates): Adjust.

Reverting this commit fixes the problem on the current gcc.

The problematic code that should be compilable is attached after the "CODE"

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
       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;


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

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

template <int format>
class ValueTypeInfo {

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

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

More information about the Gcc-bugs mailing list