language-c-0.3.0: Analysis and generation of C code





This module contains definitions for representing C translation units. In contrast to Language.C.Syntax.AST, the representation tries to express the semantics of of a translation unit.


Sums of tags and identifiers

data TagDef Source

Composite type definitions (tags)

typeOfTagDef :: TagDef -> TypeNameSource

return the type corresponding to a tag definition

class Declaration n whereSource

All datatypes aggregating a declaration are instances of Declaration


getVarDecl :: n -> VarDeclSource

get the name, type and declaration attributes of a declaration or definition

declIdent :: Declaration n => n -> IdentSource

get the variable identifier of a declaration (only safe if the the declaration is known to have a name)

declName :: Declaration n => n -> VarNameSource

get the variable name of a Declaration

declType :: Declaration n => n -> TypeSource

get the type of a Declaration

declAttrs :: Declaration n => n -> DeclAttrsSource

get the declaration attributes of a Declaration

data IdentDecl Source

identifiers, typedefs and enumeration constants (namespace sum)


Declaration Decl

object or function declaration

ObjectDef ObjDef

object definition

FunctionDef FunDef

function definition

EnumeratorDef Enumerator

definition of an enumerator

objKindDescr :: IdentDecl -> StringSource

textual description of the kind of an object

splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl, (Map Ident Enumerator, Map Ident ObjDef, Map Ident FunDef))Source

splitIdentDecls includeAllDecls splits a map of object, function and enumerator declarations and definitions into one map holding declarations, and three maps for object definitions, enumerator definitions and function definitions. If includeAllDecls is True all declarations are present in the first map, otherwise only those where no corresponding definition is available.

Global definitions

data GlobalDecls Source

global declaration/definition table returned by the analysis


emptyGlobalDecls :: GlobalDeclsSource

empty global declaration table

filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDeclsSource

filter global declarations

mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDeclsSource

merge global declarations

Events for visitors

data DeclEvent Source

Declaration events

Those events are reported to callbacks, which are executed during the traversal.


TagEvent TagDef

file-scope struct/union/enum event

DeclEvent IdentDecl

file-scope declaration or definition

TypeDefEvent TypeDef

a type definition

AsmEvent AsmBlock

assembler block

Declarations and definitions

data Decl Source

Declarations, which aren't definitions


Decl VarDecl NodeInfo 

data ObjDef Source

Object Definitions

An object definition is a declaration together with an initializer.

If the initializer is missing, it is a tentative definition, i.e. a definition which might be overriden later on.

isTentative :: ObjDef -> BoolSource

Returns True if the given object definition is tentative.

data FunDef Source

Function definitions

A function definition is a declaration together with a statement (the function body).


FunDef VarDecl Stmt NodeInfo 

data MemberDecl Source

Struct/Union member declaration


MemberDecl VarDecl (Maybe Expr) NodeInfo
MemberDecl vardecl bitfieldsize node
AnonBitField Type Expr NodeInfo
AnonBitField typ size

data TypeDef Source

typedef definitions.

The identifier is a new name for the given type.

identOfTypeDef :: TypeDef -> IdentSource

return the idenitifier of a typedef

Declaration attributes

data DeclAttrs Source

Declaration attributes of the form DeclAttrs isInlineFunction storage linkage attrs

They specify the storage and linkage of a declared object.


DeclAttrs Bool Storage Attributes
DeclAttrs inline storage attrs

data Storage Source

Storage duration and linkage of a variable



no storage

Auto Register

automatic storage (optional: register)

Static Linkage ThreadLocal

static storage, with linkage and thread local specifier (gnu c)

FunLinkage Linkage

function, either internal or external linkage

declStorage :: Declaration d => d -> StorageSource

get the Storage of a declaration

data Linkage Source

Linkage: Either internal to the translation unit or external


data Type Source

types of C objects


DirectType TypeName TypeQuals

a non-derived type

PtrType Type TypeQuals Attributes

pointer type

ArrayType Type ArraySize TypeQuals Attributes

array type

FunctionType FunType

function type

TypeDefType TypeDefRef

a defined type

TypeOfExpr Expr

(GNU) typeof (broken and should be removed, but we do not yet have expression type analysis)

data FunType Source

Function types are of the form FunType return-type params isVariadic attrs.

If the parameter types aren't yet known, the function has type FunTypeIncomplete type attrs.

isFunctionType :: Type -> BoolSource

return True if the given type is a function type

Result is undefined in the presence of TypeOfExpr or undefined typeDefs

derefTypeDef :: Type -> TypeSource

resolve typedefs, if possible

data ArraySize Source

An array type may either have unknown size or a specified array size, the latter either variable or constant. Furthermore, when used as a function parameters, the size may be qualified as static. In a function prototype, the size may be `Unspecified variable size' ([*]).


UnknownArraySize Bool
UnknownArraySize is-starred
ArraySize Bool Expr
FixedSizeArray is-static size-expr

data TypeDefRef Source

typdef references If the actual type is known, it is attached for convenience

data BuiltinType Source

Builtin type (va_list)



data FloatType Source

floating point type (C99



class HasSUERef a whereSource

accessor class : struct/union/enum names


sueRef :: a -> SUERefSource

class HasCompTyKind a whereSource

accessor class : composite type tags (struct or union)


compTag :: a -> CompTyKindSource

typeOfCompDef :: CompType -> TypeNameSource

return the type of a composite type definition

data CompTyKind Source

a tag to determine wheter we refer to a struct or union, see CompType.



data EnumType Source

Representation of C enumeration types


EnumType SUERef [Enumerator] Attributes NodeInfo
EnumType name enumeration-constants attrs node

typeOfEnumDef :: EnumType -> TypeNameSource

return the type of an enum definition

data Enumerator Source

An Enumerator consists of an identifier, a constant expressions and the link to its type

data TypeQuals Source

Type qualifiers: constant, volatile and restrict




constant :: Bool
volatile :: Bool
restrict :: Bool

noTypeQuals :: TypeQualsSource

no type qualifiers

mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQualsSource

merge (&&) two type qualifier sets

Variable names

data VarName Source

VarName name assembler-name is a name of an declared object


VarName Ident (Maybe AsmName) 

type AsmName = CStrLitSource

Assembler name (alias for CStrLit)

Attributes (STUB, not yet analyzed)

data Attr Source

__attribute__ annotations

Those are of the form Attr attribute-name attribute-parameters, and serve as generic properties of some syntax tree elements.

Some examples:

  • labels can be attributed with unused to indicate that their not used
  • struct definitions can be attributed with packed to tell the compiler to use the most compact representation
  • declarations can be attributed with deprecated
  • function declarations can be attributes with noreturn to tell the compiler that the function will never return,
  • or with const to indicate that it is a pure function

TODO: ultimatively, we want to parse attributes and represent them in a typed way


Attr Ident [Expr] NodeInfo 

Statements and Expressions (STUB, aliases to Syntax)

type Stmt = CStatSource

Stmt is an alias for CStat (Syntax)

type Expr = CExprSource

Expr is currently an alias for CExpr (Syntax)

type Initializer = CInitSource

Initializer is currently an alias for CInit.

We're planning a normalized representation, but this depends on the implementation of constant expression evaluation

type AsmBlock = CStrLitSource

Top level assembler block (alias for CStrLit)