gcc および IBM xlc (AIX 用バージョン 10.1) コンパイラーでコンパイルする必要がある C++ コードを生成するドメイン固有言語を作成しています。
1 つの特定のコード スニペットで生成された C++ コードは、gcc では完全に機能しますが、xlc ではそれほど機能しません。コンパイル エラーが発生する最小限のケースにコードを変更しました。
//bug183.h
class emptyList
{};
extern emptyList weco;
class otherClass
{
public:
otherClass();
otherClass(const int & p);
otherClass(const emptyList & e);
int geta() {return a;}
private:
int a;
};
class someClass
{
public:
someClass();
someClass(const someClass & other);
someClass(const otherClass & p1, const otherClass & p2);
void exportState();
private:
otherClass oc1;
otherClass oc2;
};
//bug183.cpp
#include "bug183.h"
#include <iostream>
emptyList weco = emptyList();
otherClass::otherClass() {a = 0;}
otherClass::otherClass(const int & p) {a = p;}
otherClass::otherClass(const emptyList & e) {a = 1000;}
someClass::someClass() {oc1 = otherClass(); oc2 = otherClass();}
someClass::someClass(const someClass & other) {oc1 = other.oc1; oc2 = other.oc2;}
someClass::someClass(const otherClass & p1, const otherClass & p2) {oc1 = p1; oc2 = p2;}
void someClass::exportState() {std::cout << oc1.geta() << " " << oc2.geta() << std::endl;}
int main()
{
someClass dudi;
dudi.exportState();
//this line triggers the error in xlc
someClass nuni = (someClass(otherClass(weco), otherClass(weco)));
nuni.exportState();
return 0;
}
これをコンパイルすると、次のエラーが発生します: "bug183.cpp", line 21.66: 1540-0114 (S) パラメータ名は、この関数の別のパラメータと同じであってはなりません。
しかし、次のようにコンストラクター呼び出しで囲み括弧を削除すると:
someClass nuni = someClass(otherClass(weco), otherClass(weco));
エラーはなくなります。また、コンストラクターを括弧で囲んでもエラーが消えるときにweco
作成された別の extern 変数に変更するweco
と、このエラーが表示されるには両方の条件が存在する必要があると言っても過言ではありません。
なぜ括弧を削除しないのかと尋ねる人もいるかもしれませんが、削除すると正しく動作しているコードの一部が損なわれる可能性があるため、この動作が C++ コンパイラで想定されているかどうかを理解したいと思っています。少なくとも、既知の回避策があります。