問題タブ [compiler-bug]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java コンパイラのバグの可能性があります。一部のコンパイラでプログラムがコンパイルされない
まず、背景を少し説明します (興味がない場合は、少し読み飛ばしてください)。私はイライラして混乱しています!これは非常に単純な使用例であるはずであり、実際、私のコードはEclipse JDT コンパイラーで問題なくコンパイルされているため、これまで確実に実行できるように Maven を構成してきました。Oracle JDK と OpenJDK でコンパイルされないことがあまりにも気になっていて、実際には私のコードに問題があるのではないかと思ったので、もう一度調べてみました。
おそらくバグは、コンパイルを許可するための JDT コンパイラにあり、許可しないための Oracle JDK と OpenJDK ではなく、どちらもこれをテストしたと思いました。問題の元のコードはかなり複雑だったので、問題がどこにあるのかを特定するのははるかに困難でした.
Eclipse JDT コンパイラーまたは Oracle JDK と OpenJDK のいずれかに、かなり重大な (imho) バグがあります。
TL;DR
これは、問題のコードのかなり最小限の表現です。( Anything の型境界は任意のインターフェイスで置き換えることができ、コンパイラの動作は変わりません):
要約すると、これは問題なくコンパイルできるはずですが、Oracle JDK 7 & 8 と OpenJDK 7 は一致しません。Eclipse Juno を使用してコンパイルします。
上記のコードをこれらのコンパイラのいずれかでコンパイルすると、次のようなエラーが発生しますが、JDT コンパイラでは問題なく動作します。
これは意味がありません。戻り値の型は明らかに関連しています。なぜなら、参照されている 2 つのメソッドのうちの 1 つが必然的に他のメソッドをオーバーライドするからです。私はこれが機能するはずだとほぼ 99% 確信しています。実際、最後の 1% が欠落している唯一の理由は、ジェネリックの使用が基本的すぎて発見されていないためですが、関連するバグレポートは見つかりませんでした。それに。(確かに、 http://bugs.sun.com/は最悪なので、詳しく調べていませんでした。バグ レポートがまだ開いているかどうかで、キーワード検索結果をフィルタリングすることさえできますか? うーん。)
私にとって最も紛らわしい部分は、余分なインターフェイスがエラーとは何の関係もないにもかかわらず、X 上の Anything の型境界を削除すると、問題なくコンパイルされることです。
誰か私の心を休ませてくれませんか? このために存在するバグレポートを知っている人、または以前に経験したことがある人で、何が問題なのか教えてもらえますか? 決定的な回答が得られない場合は、いくつかのバグ レポートを提出します。
編集:
<S extends C, C> で前方参照エラーが発生したと何人かが指摘しました。なぜこのエラーが発生しなかったのかわかりません.JDTを使用してEclipseでコンパイルしました...
とにかく、OpenJDK 7 または Oracle JDK 7/8 ではまだコンパイルできないので、質問を修正して問題を解決しました。
編集2:
簡単なチェックで、この種の前方参照が Java 7 で合法であることが確認されました。
編集3:
http://bugs.sun.com/にバグ レポートを投稿しました。承認された場合は、ここにリンクを投稿します。
c# - 空の割り当てがエラーなしでコンパイルされた理由
これが私のスニペットです:
2行目を参照してください。
そして、それは正常にコンパイルされ、クラウドにも公開されました。変!
scala - Scala コンパイラのバグを見つけましたか?
Scala 2.9.1 では、これはコンパイルされず、 not found: value bで失敗します。
ただし、これは次のことを行います。
唯一の違いは、コメント行です。これがバグでない場合、なぜこれが意図された動作なのですか?
c++ - POD のゼロ初期化
これは次のように使用されます。
Bounds
およびVector
は非 POD クラスであり、dist
は の typedef ですint64_t
。
line
ただし、最適化された VC++11 の 32 ビット リリース ビルドでは、while ループ内に少なくとも初期化されていない部分が残っているようです。なんで?によると、型名の後の括弧は新しいものと違いがありますか? 、それはゼロで初期化されているはずですよね?
構造体メンバーの値をファイルに記録します。
- after
Line line = {};
: 非 POD タイプはデフォルトで初期化され、その他は 0 です。 - after
line = Line();
: POD タイプはまだデフォルトで初期化されており、その他にはランダムな値が含まれています。
c++ - コンパイラのバグを回避する
大きな計算ジオメトリ ライブラリがあります。カーネルに問題があります。cg::epsilon<T>()
の代わりに単純に書くために、自由関数の形式で定義されたスカラー テイトとヘルパー アクセサがありcg::scalar_traits<T>::epsilon
ます。しかし、vs2008 と vs2010 では、T
inのテンプレート パラメーターを推定できなかったと主張することがあるという問題がありますcg::epsilon<T>
。LWS の他のコンパイラでは正常に動作します。
再現する縮小版:
アクセサーを機能させるための回避策はありますか?
PS:cg::scalar_traits<S>::epsilon()
エラーが発生した場合に役立つ を使用していますが、冗長すぎます
研究: としても宣言されています
コンパイラは、cg::epsilon の S を推測できなかったと不平を言っています。
c++ - VS2012 - 末尾の戻り値の型のテンプレート パラメーターとしての Decltype
次のコードは、gcc および VC11 Nov CTP でも動作しますが、VC11 RTM ではコンパイルに失敗します。
- VC11 RTM: http://rise4fun.com/Vcpp/9u2
- VC11 CTP: http://rise4fun.com/Vcpp/6lS
VC11 RTM は、decltype が戻り値のテンプレート パラメーターとして渡されると失敗するようです。「T=unknown」と見なされます。f
内部で decltype を使用しているにもかかわらず、正常にコンパイルされることに注意してください。
これは RTM のコンパイラのバグですか? もしそうなら、それを回避する方法はありますか?
c# - この共分散宣言がコンパイルされるのはなぜですか?
次のインターフェイスを検討してください。
エラーや警告なしでコンパイルされます。
この質問で説明し、共分散と反分散の FAQで言及されているように:
バリアンスは、型パラメーターが参照型である場合にのみサポートされます。
では、なぜ上記のインターフェースはコンパイルされるのでしょうか? 「out」キーワードで失敗する(または少なくとも警告する)のは理にかなっています。質問は要約すると思います-out
上記の例でキーワードを使用すると違いが生じる場合はありますか?
更新: 上記のインターフェイスを見て気付かない開発者がすり抜けてしまう可能性がある、誤解を招く動作の例を次に示します。
コーダーが値の型に対してバリアンスが機能しないことを認識していない場合、キーワードtrue
のために2 行目が返されることを期待しますが、返されることはありません。out
これはまさに、この質問をするように促したバグです...
コンパイルしても予期しない結果になるコードの別の例:
私はこれが機能することを期待していますが (参照型に対する共分散の制限については知りません)、System.InvalidCastException が発生します。
c# - operator == を nullable に持ち上げる式を作成するときに、ジェネリック構造体と非ジェネリック構造体の扱いが異なるのはなぜですか?
これは、ジェネリック構造体のオペランドを null に持ち上げる際のバグのようです。
をオーバーライドする次のダミー構造体を検討してくださいoperator==
。
ここで、次の式を検討してください。
3 つすべてが期待どおりにコンパイルおよび実行されます。
それらを ( を使用して) コンパイル.Compile()
すると、次のコードが生成されます (IL から英語に言い換えられています)。
MyStruct
(null 許容ではない) 引数のみを受け取る最初の式は、単純op_Equality
に (の実装operator ==
)を呼び出します。2 番目の式は、コンパイル時に、各引数をチェックして
HasValue
. 両方が等しくない (両方が等しいnull
) 場合は、 を返しますtrue
。1 つだけ値がある場合は、 を返しますfalse
。それ以外の場合は、2 つの値を呼び出しop_Equality
ます。3 番目の式は、null 許容引数をチェックして、値があるかどうかを確認します。値がない場合は false を返します。それ以外の場合は、 を呼び出します
op_Equality
。
ここまでは順調ですね。
次のステップ: ジェネリック型でまったく同じことを行います - 型の定義のすべての場所に変更MyStruct
し、式でそれを変更します。MyStruct<T>
MyStruct<int>
3 番目の式はコンパイルされますがInvalidOperationException
、次のメッセージとともに実行時例外がスローされます。
演算子 'Equal' のオペランドがメソッド 'op_Equality' のパラメーターと一致しません。
上記のすべての nullable-lifting を使用して、ジェネリック構造体が非ジェネリック構造体とまったく同じように動作することを期待します。
だから私の質問は:
- ジェネリック構造体と非ジェネリック構造体に違いがあるのはなぜですか?
- この例外の意味は何ですか?
- これは C#/.NET のバグですか?
これを再現するための完全なコードは、この gist で入手できます。