apple/swift-clang/include/clang/AST コードリーディング(全体)
概要
Type.h
Qualifiers::TQ
これらのフラグはDeclSpec::TQ
と同期して保持する必要がある
definition | value | description |
---|---|---|
Const | 0x1 | ??? |
Restrict | 0x2 | ??? |
Volatile | 0x4 | ??? |
CVRMask | Const | Volatile | Restrict |
??? |
Qualifiers::GC
TBD: GCと定義名にあるが、意味としてはARC?要調査
definition | desc |
---|---|
GCNone | ??? |
Weak | ??? |
Strong | ??? |
Qualifiers::ObjCLifetime
definition | desc |
---|---|
OCL_None | この種類のlifetime はない |
OCL_ExplicitNone | このオブジェクトは保持、または解放を必要とせず変更できる |
OCL_Strong | このオブジェクトに割り当てるには、古い値を解放し、新しい値を保持する必要がある。 古い値の解放タイミングは不正確で、値が有効な最後の覚えてるポイントの直後に移動される可能性がある |
OCL_Weak | このオブジェクトから読み書きするにはbarrier call が必要 |
OCL_Autoreleasing | このオブジェクトに割り当てるにはlifetime の延長が必要 |
Type
型階層の基本クラス
Typeの中心的な概念は各Typeが常にcanonical type
を持つこと。
canonical type
は型定義名が全て削除された型、またはそれが参照する型のこと。
例えば次の点を考慮する
typedef int foo; typedef foo* bar; 'int *' 'foo *' 'bar'
「int」のために作成されたTypeオブジェクトがある、intはcanonicalなので、CanonicalTypeポインタはそれ自身を指す
「foo」の型(TypedefType)もある
CanonicalTypeポインタが「int」型を指している。
次に「int」のような「int *」を表すPointerType型があり、「int」のようにcanonicalである。
最後にcanonical typeが「int * 」である「foo * 」のPointerType型があり、canonical typeも「int * 」である「bar」のTypedefTypeがある。
Non-canonical typeは使用されるtypedefに関する情報を失うことなく診断を発行するのに便利。
canonical typeは型の比較(ポインタに透過性検査を可能にする)に有用であり、ある型から全ての型定義を暗黙的に再帰的に取り除くため、型が特定の型となる。(関数型など)
Typeらは一度作成すると変更できない。
Typeのクラス図
clang.llvm.orgより拝借