Semantic analysis for cast-expressions.


Walter Bright

Source: dcast.d

  • Declaration

    Expression implicitCastTo(Expression e, Scope* sc, Type t);

    Do an implicit cast. Issue error if it can't be done.

  • Declaration

    MATCH implicitConvTo(Expression e, Type t);

    Return MATCH level of implicitly converting e to type t. Don't do the actual cast; don't change e.

  • Declaration

    Expression castTo(Expression e, Scope* sc, Type t);

    Do an explicit cast. Assume that the 'this' expression does not have any indirections.

  • Declaration

    Expression inferType(Expression e, Type t, int flag = 0);

    Set type inference target t Target type flag 1: don't put an error when inference fails

  • Declaration

    Expression scaleFactor(BinExp be, Scope* sc);

    Scale addition/subtraction to/from pointer.

  • Declaration

    bool typeMerge(Scope* sc, TOK op, Type* pt, Expression* pe1, Expression* pe2);

    Combine types.

    Output: *pt merged type, if *pt is not NULL *pe1 rewritten e1 *pe2 rewritten e2

    Return Value

    true success false failed

  • Declaration

    Expression typeCombine(BinExp be, Scope* sc);

    Bring leaves to common type.

    Return Value

    null on success, ErrorExp if error occurs

  • Declaration

    Expression integralPromotions(Expression e, Scope* sc);

    Do integral promotions (convertchk). Don't convert to

  • Declaration

    void fix16997(Scope* sc, UnaExp ue);

    This provides a transition from the non-promoting behavior of unary + - ~ to the C-like integral promotion behavior.


    Scope* sc


    UnaExp ue

    NegExp, UAddExp, or ComExp which is revised per rules

  • Declaration

    bool arrayTypeCompatibleWithoutCasting(Type t1, Type t2);

    See if both types are arrays that can be compared for equality without any casting. Return true if so. This is to enable comparing things like an immutable array with a mutable one.

  • Declaration

    IntRange getIntRange(Expression e);