Clang
プログラミング言語Cの次期仕様C2yでは、複素数型(_Complex float/double/long double)に対するインクリメント/デクリメントが正式サポートされる。gcc/Clangでは独自拡張としてサポート済み。 _Complex double c = 41.; ++c; // OK: C2y assert(c == 42.);…
プログラミング言語C++の次期標準C++2c(C++26)から、if/while/for/switch構文の条件式(condition)部に構造化束縛(structured binding)を記述できる。 // C++2c if (auto [a, b] = func()) { // 関数戻り値からbool型への変換結果がtrueとなるときに限り // …
C++標準ライブラリの直和データ型std::variant<...>と組み合わせて空の状態を表すstd::monostateオブジェクトでは、std::hashによるハッシュ計算がサポートされる。*1各C++処理系で算出されるハッシュ値の一覧(括弧内は併記コメント/定数名): GCC: -7777…
プログラミング言語Cの次期C2x(C23)言語仕様では、空のブレース{}を用いた配列・構造体の初期化が許容される。C++では当初からOK。 typedef struct S { int m1, m2; } S; // C17:ill-formed / C2x:OK / C++:OK int arr0[10] = {}; S obj0 = {}; // C:OK / C+…
GCCとClangの独自拡張 returns_twice 属性についてメモ。対象関数から「2回以上制御が戻ってくる可能性」*1をコンパイラに伝える属性。コンパイラによる一部の最適化処理を抑止する。 The returns_twice attribute tells the compiler that a function may r…
C++標準ライブラリで定義されるグローバルオブジェクトstd::cout等の宣言と定義についてメモ。GCC/libstdc++およびClang/libcxxライブラリ実装では、宣言型(std::ostream)と実体定義の型(char[])を意図的に変えている。型の不一致は厳密にはC++仕様違反*1だ…
C++2a(C++20)標準ライブラリ<numbers>では、変数テンプレート(variable template)*1により浮動小数点型(float, double, long double)にあわせた数学定数を提供する。一方、浮動小数点型以外によるプライマリテンプレート利用はill-formedとなることが要請されている。</numbers>…
C++においてコンストラクタ/デストラクタからの仮想関数呼び出しそれ自体はwell-definedだが、おそらくC++プログラマの期待する振る舞いではない。バグの温床になりえるため、大抵のコーディング規約で禁止している(はず)。かつてClangに本件を検知する警…
Clangコンパイラはユーザ定義のコンパイル警告/エラーメッセージ出力を行うdiagnose_if属性を提供する。 The diagnose_if attribute can be placed on function declarations to emit warnings or errors at compile-time if calls to the attributed funct…
C言語の可変引数リストアクセス用 va_arg マクロにおける奇妙な制限事項についてメモ。va_argマクロの第二引数へ指定する型名には、“関数ポインタ型” や “配列へのポインタ型” を直接記述できない。ただしtypedefによる別名であればOK。こんなコード書くやつ…
C++17標準ライブラリには「型が異なる変数間での値交換(swap)」可能か否かを判定するメタ関数std::is_(nothrow_)swappable_with<T, U>が存在する。一般的には値交換操作は同一型変数間(swap(T&, T&))で行われるが、プロキシ型(proxy)のような特殊ケースにおいて異</t,>…
プログラミング言語C++において、“default指定でdeletedされるムーブコンストラクタ/代入演算子(→id:yohhoy:20130203)” はオーバーロード解決に影響しない。これはCWG DR 1402で修正された挙動。 struct X { const int i = 42; // constデータメンバを含…
C++1z(C++17)で追加される fallthrough属性 の利用に関する注意点について。下記コードの★部ではフォールスルー(fallthrough)明示を意図しているが、C++コンパイラはプログラマの期待通り振舞わない。これは末尾セミコロン(;)を忘れたことで、fallthrough属…
C99仕様で拡張された構文を用いて、関数引数としてのポインタ型に非NULLアノテーションを行う方法。正直微妙。 int f1(int *p) { if (p == NULL) return 42; return *p; } int f2(int p[static 1]) { if (p == NULL) return 42; return *p; } Clang 3.5/-O1…
LLVM/Objective-Cのatomic属性プロパティが保証する性質、C言語(C11)のAtomic変数アクセスとの比較、およびマルチスレッド処理での利用についてメモ。超要約:Objective-C @property宣言には常にnonatomic属性を指定せよ。atomic属性プロパティは人類には早…
LLVM/Clangでは、戻り値最適化(RVO; return value optimization)を阻害する/単に冗長なstd::move関数利用を警告するオプションが提供される。Clang 3.7で追加された警告オプション。両オプションとも -Wall オプション指定に含まれるため、個別に指定するケ…
プログラミング言語C++において、関数からの return 文と暗黙のムーブと型変換の関係についてメモ。*1下記コードfunc_implicit_move関数のように return 文にて型変換(unique_ptr→shared_ptr)を伴う場合、C++11/14言語仕様によって振る舞いが異なる。この…
LLVM/Clangコンパイラの警告オプション(-Wxxx)と出力メッセージの対応一覧表。Clangソースコードから機械抽出とのこと。 http://fuckingclangwarnings.com/(2021-04-09現在サイト消滅) https://github.com/NSHipster/clangwarnings.com
2020-08-13追記:C++17で言語仕様が調整され、constexpr関数であってもnoexceptは特別扱いされなくなった。詳細は c++ - `noexcept` behavior of `constexpr` functions - Stack Overflow 参照のこと。定数式(constant expression)中で呼び出すconstexpr関数…
C++11以降では、ユーザ定義変換演算子(user-defined conversion operator)の戻り値型をconst Tよりも非constなTとしたほうが良い。関数オーバーロードで引数型const T&およびT&&を受ける関数*1へ渡す際に、同関数呼び出し時のオーバーロード解決失敗によるコ…
C++14で導入されるジェネリックラムダ(generic lambda)、可変長引数テンプレート(variadic template parameter)、ellipsis(...)の組み合わせによる文法上の曖昧さについて。gccとClangのバグ。 struct { template<typename...Args> auto operator()(Args&&...) const { } } f1</typename...args>…
Clang関連ツール clang-modernize についてメモ。C++ソースコードレベルでC++11機能を使うよう自動変換するツール。 http://clang.llvm.org/extra/clang-modernize.html Clang 3.6現在、下記のソースコード変換に対応している。 range-based forループへの変…
C++11で導入されたUniform Initializationと参照型変数に関するメモ。C++11(N3337)言語仕様の問題としてCWG defect #1288で挙げられ、C++14 Draft N3376にてWording修正が適用された。*1 struct S {}; int main() { S v; S & r{ v }; // ?? } gcc gcc 4.8.2…
C++11標準ライブラリに追加された乱数生成器(RNG; Random Number Generator)のオブジェクトサイズについてメモ。注意:具体的なオブジェクトサイズは実装依存となるため、下表は各オブジェクト間のオーダー比較程度に解釈すること。 RNG gcc/64 gcc/32 Clang…
C++11の属性(attribute)は空文に対しても指定可能。Clangではswitch構文caseラベルにてfall-through動作を明示できる。このとき空文(;のみ)に独自拡張のclang::fallthrough属性を指定する。 2020-05-05追記:fallthrough属性はC++17から標準サポートされて…
プログラミング言語C/C++のchar型が、符号あり/符号なしのいずれかは処理系定義(implementation defined)*1。各コンパイラでの実装についてメモ。まとめ: char型を「符号あり(signed)」と仮定しないこと。(とはいえ、この仮定をおくコードは多い…) 特にA…
C/C++プリプロセッサにおいて、一意な識別子名生成に利用できる__COUNTER__マクロについて。非標準機能だが主要コンパイラで一通りサポートされている。2024-09-26追記:C2y向けWG14提案文書 N3190 にて、C++2c向けWG21提案文書 P3384 にて__COUNTER__マクロ…
プログラミング言語C++における無名名前空間(unnamed namespace)*1の、一見すると不思議な(実は根拠がある)定義に関するメモ。本記事はStack Overflow上での質問と回答内容に基づく。 C++言語仕様での定義 C++03 7.3.1.1/p1では、unnamed namespaceの振る…