pub struct Decl {
pub name: Option<Symbol>,
pub ty: TypeId,
pub kind: DeclKind,
pub linkage: Linkage,
pub duration: StorageDuration,
pub state: Definition,
pub alignment: Option<u32>,
pub init: Option<InitList>,
pub params: DeclList,
pub body: Option<StmtId>,
}Expand description
An object or a function, as it was declared.
Fields§
§name: Option<Symbol>The name, absent for a compound literal and for a parameter that was not given one.
ty: TypeIdThe type, after the adjustments a declaration performs: an array parameter has already become a pointer, and a function parameter a function pointer.
kind: DeclKindWhether it is an object or a function.
linkage: LinkageWhether the name is shared with other translation units, and how.
duration: StorageDurationHow long the object lives.
state: DefinitionHow much of a definition this declaration is.
alignment: Option<u32>The alignment alignas asked for, absent when the type’s own alignment stands.
init: Option<InitList>The initializer, flattened, absent when there was none. An empty list is = {}, which
C23 added and which zero-initializes, and is not the same as no initializer at all.
params: DeclListThe parameters of a function definition, in order, and empty for everything else.
A parameter is an object with automatic storage like any other, and the body refers to one the same way it refers to a local. What is different is that nothing in the body declares it, so without this there is no way to ask which objects a definition takes and in what order, which is the first question the walk to the IR has: the entry block’s parameters are these, in this order.
A declaration that is not a definition has none of these even when it was written with a
prototype, because int f(int a); declares no object called a. The types are in the
function type, which is where a call reads them.
body: Option<StmtId>The body of a function definition.