BYOC CodeGen for customized Call Node/Operator

I just encounter a problem that

Check failed: (!actual_type.defined()) is false: Expected type PrimExpr but got relay.Var

Even though my new operator defined with

Expr MakeFun(Expr X1, Expr X2, Expr X3, DataType out_dtype) 

My type relation function is written as

bool FunRel(const Array<Type>& types, int num_inputs, const Attrs& attrs,
                 const TypeReporter& reporter) {
      CHECK_EQ(types.size(), 4);                 
      ​reporter->Assign(types[3], type[0]);
      return true;
}

I just want the output type match the type of the first input (X1).