anchor.diff:              | CAddressOf(t, e) -> CLPtr(t, e)
               | CVecSwizzle(t, e, c) -> CLVecSwizzle(t, ofExpr e, c)
               | CMatrixElement(t, e, r, c) -> CLMatrixElement(t, ofExpr e, r, c)
  +            | CReadInput(k,t,n,i) -> CLInput(k,t,n,i)
               | _ -> failwithf "[FShade] cannot convert CExpr toCLExpr (%A)" e
               
       let rec ofExprSafe (e : CExpr) =
  
positive.code:             | CLPtr(t,_) -> t
              | CLVecSwizzle(t, _, _) -> t
              | CLMatrixElement(t, _, _, _) -> t
  
  [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
  module CLExpr =
  
negative.code:                 | CMatrixElement(t, e, r, c) ->
                      let! e = ofExprSafe e
                      return CLMatrixElement(t, e, r, c)
                      
                  | CReadInput(k,t,n,i) -> 
                      return CLInput(k,t,n,i)
  
                  | _ -> 
                      return! None
  