       this
     ]
 
+    # Produce the consequent when the condition is truthy
+    # Produce the alternative when the condition is falsey
+    # Prepend the condition if it has side effects
     [CS.Conditional, (inScope) ->
       if isFalsey @condition
         block = @elseBlock

      block
    ]

    # for-in over empty list
    [CS.ForIn, (inScope, ancestors) ->
      return this unless (@expression.instanceof CS.ArrayInitialiser) and @expression.members.length is 0
      retVal = if usedAsExpression this, ancestors then new CS.ArrayInitialiser [] else new CS.Undefined
      new CS.SeqOp (declarationsFor this), retVal.g()
    ]

    # for-own-of over empty object
    [CS.ForOf, ->
      return this unless (@expression.instanceof CS.ObjectInitialiser) and @expression.isOwn and @expression.members.length is 0
      retVal = if usedAsExpression this, ancestors then new CS.ArrayInitialiser [] else new CS.Undefined


  defaultRules = [

    # If a program has no side effects, then it is the empty program
    [CS.Program, ->
      if @block? and mayHaveSideEffects @block, [] then this
      else new CS.Program null
    ]

    # Turn blocks into an expressions
    [CS.Block, (inScope, ancestors) ->
      switch @statements.length
        when 0 then (new CS.Undefined).g()
