私はすでにhttp://www.cplusplus.com/forum/general/96128/でこの質問をしましたが、役に立ちませんでした。
g++ 4.2 で同じバグを経験した人はいますか?internal compiler error: in make_thunk, at cp/method.c:129
サンプルコードを含める必要はないと思います。それぞれのコードは、clang++ だけでなく、他のいくつかの新しい g++ バージョンでも警告やエラーなしでコンパイルされます。それは単に正しいことであり、バグは GCC の bugzilla で言及されていました (頻繁に再発するように見えるため、数回も) が、回避策は提供されませんでした。
新しい g++ を使用するように言わないでください。Ubuntu Hardyに同梱されている g++ でコンパイルする必要があるため、コンパイラを変更することはできません。主な開発は Ubuntu Precise で行っていますが、Hardy との互換性を維持する必要があります。
サンクがどうあるべきかわかりません。共変や多重継承に関係していると思われるだけです。また、Hardy のコンパイラのバグのために、名前がクラスの名前であるという唯一の変更にもかかわらず、私はそれを変更する目的がありません。
もう 1 つの事実は、インクルード時に発生することです。
In file included from /home/heiko/hgl/src/compiler/compilerprojectfactory.cpp:18:
/home/heiko/hgl/src/compiler/compilertype.h: In instantiation of 'HGL::Compiler::CompilerType<HGL::Vector2D, HGL::Compiler::CompilerBase>':
/home/heiko/hgl/src/compiler/compilervector2d.h:23: instantiated from here
/home/heiko/hgl/src/compiler/compilertype.h:22: internal compiler error: in make_thunk, at cp/method.c:129
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
For Debian GNU/Linux specific bug reporting instructions,
see <URL:file:///usr/share/doc/gcc-4.2/README.Bug
編集: ここで、バグの原因となるヘッダー:
#include "compilertype.h"
#include "vector2d.h"
namespace HGL {
class Vector2D;
namespace Compiler {
/**
@author Heiko Schäfer <heiko@rangun.de>
*/
class _LOCAL Vector2D : public Compiler::CompilerType<HGL::Vector2D> {
DISALLOW_COPY_AND_ASSIGN(Vector2D)
public:
Vector2D(float x, float y, int line);
using IType::operator=;
virtual operator HGL::Vector2D &() const throw(InvalidExpressionException);
protected:
virtual ~Vector2D();
void append(ISerializeable::BUFFER *dest, const HGL::IType *type) const;
};
}
}
テンプレートは次のとおりです。
#include "compilerbase.h"
#include "iproject.h"
#include "util.h"
namespace HGL {
namespace Compiler {
const IProject::VSTRUCT minReq = { HGL_MINREQ_MAJOR, HGL_MINREQ_MAJOR, HGL_MINREQ_MAJOR };
template<class Type, class Base = CompilerBase>
class _LOCAL CompilerType : public Type, public Base {
DISALLOW_COPY_AND_ASSIGN(CompilerType)
public:
using IType::operator=;
template<class Param>
inline CompilerType(const Param &p, bool b, int line,
const IProject::VSTRUCT &vs = IProject::VSTRUCT()) :
Type(p), Base(line, b) {
init(vs);
}
template<class Param>
inline CompilerType(const Param &p, int line,
const IProject::VSTRUCT &vs = IProject::VSTRUCT()) : Type(p), Base(line) {
init(vs);
}
inline CompilerType(bool b, int line, const IProject::VSTRUCT &vs = IProject::VSTRUCT())
: Type(), Base(line, b) {
init(vs);
}
template<class Param1, class Param2>
inline CompilerType(const Param1 &p1, const Param2 &p2, int line,
const IProject::VSTRUCT &vs = IProject::VSTRUCT()) :
Type(p1, p2), Base(line) {
init(vs);
}
template<class Param1, class Param2>
inline CompilerType(const Param1 &p1, const Param2 &p2, bool b, int line,
const IProject::VSTRUCT &vs = IProject::VSTRUCT()) : Type(p1, p2),
Base(line, b) {
init(vs);
}
inline CompilerType(int line,
const IProject::VSTRUCT &vs = IProject::VSTRUCT()) : Type(), Base(line) {
init(vs);
}
inline virtual void append(ISerializeable::BUFFER *dest, const IType *type) const {
Base::append(dest, type);
}
protected:
inline virtual ~CompilerType() {}
inline virtual void init(const IProject::VSTRUCT &vs) {
const_cast<IProject::VSTRUCT &>(vs) = std::max(vs, minReq);
CompilerBase::setMinRequiredVersion(vs, Type::getSerialID());
}
};
}
}
解決しました!
g++ 4.2 のソース コードを掘り下げた後、完全なツリー内のすべての型について今必要であることがわかりました。g++ > 4.2 は明らかにこれを必要としません。
したがって、エラーは、転送された特殊化を持つテンプレート メンバーを持つ関連クラスにありました。転送の代わりにヘッダーを含めただけで、g++ 4.2 は満足でした。
それ以外の場合、エラーを出さないのは本当に良くないバグですが、この役に立たないメッセージです。