apple/swift-clang/include/clang/AST コードリーディング(全体)

概要

swift-clang/include/clang/AST at 0a8078f3c1190c7b6c2e021ad6b102971bca5413 · apple/swift-clang · GitHub

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より拝借