]> www.ginac.de Git - ginac.git/commit
Work around a compiler bug on MSVC.
authorJan Rheinländer <jrheinlaender@gmx.de>
Wed, 16 Feb 2022 22:57:36 +0000 (23:57 +0100)
committerRichard Kreckel <kreckel@ginac.de>
Wed, 16 Feb 2022 23:07:08 +0000 (00:07 +0100)
commitb98ef824450d2897f5ea8f5254d614e6f8148d33
treedfc697ebe734077b4b4cb1478875f6471db56290
parent1d3bdf85b4343f29a73a47481e4adc0eff0daff8
Work around a compiler bug on MSVC.

The two 'reg_info' declarations introduced in f271f67d2f turned out
to confuse MSVC: It thinks that these declarations are definitions
and then complains about a missing default ctor (error C2512) and
about duplicate definitions later in the .cpp files (error C2766).

But the standard says in [temp.expl.spec] §13:
An explicit specialization of a static data member of a template or
an explicit specialization of a static  data member template is a
definition if the declaration includes an initializer; otherwise, it
is a declaration. [Note: The definition of a static data member of a
template that requires default-initialization must use a braced-init-
list:
    template<> X Q<int>::x;     // declaration
    template<> X Q<int>::x ();  // error: declares a function
    template<> X Q<int>::x { }; // definition
--end note]
There is no initializer at lst.h:35 and at exprseq.h:35. Hence, this
is merely a declaration and the compiler's error message is wrong.
Let's work around by #ifndef'ing the two lines for silly MSVC.
ginac/exprseq.h
ginac/lst.h