From 11b29eff99910d55a54658b8a1d053cc4ec076fc Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 4 Aug 2022 14:05:02 -0700 Subject: Implicit pointer dereference when using member operator. (#2348) * Implicit pointer dereference when using member operator. * Add expected test result * Fix lookup. Co-authored-by: Yong He --- source/slang/slang-emit-c-like.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'source/slang/slang-emit-c-like.cpp') diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index b6540b5f1..226e29764 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -1291,20 +1291,39 @@ bool CLikeSourceEmitter::shouldFoldInstIntoUseSites(IRInst* inst) void CLikeSourceEmitter::emitDereferenceOperand(IRInst* inst, EmitOpInfo const& outerPrec) { + EmitOpInfo newOuterPrec = outerPrec; + if (doesTargetSupportPtrTypes()) { - // If `inst` is a variable, dereferencing it is equivalent to just - // emit its name. i.e. *&var ==> var. - // We apply this peep hole optimization here to reduce the clutter of - // resulting code. - if (inst->getOp() == kIROp_Var) + switch (inst->getOp()) { + case kIROp_Var: + // If `inst` is a variable, dereferencing it is equivalent to just + // emit its name. i.e. *&var ==> var. + // We apply this peep hole optimization here to reduce the clutter of + // resulting code. m_writer->emit(getName(inst)); return; + case kIROp_FieldAddress: + { + auto innerPrec = getInfo(EmitOp::Postfix); + bool innerNeedClose = maybeEmitParens(newOuterPrec, innerPrec); + auto ii = as(inst); + auto base = ii->getBase(); + if (isPtrToClassType(base->getDataType())) + emitDereferenceOperand(base, leftSide(newOuterPrec, innerPrec)); + else + emitOperand(base, leftSide(newOuterPrec, innerPrec)); + m_writer->emit("->"); + m_writer->emit(getName(ii->getField())); + maybeCloseParens(innerNeedClose); + return; + } + default: + break; } auto dereferencePrec = EmitOpInfo::get(EmitOp::Prefix); - EmitOpInfo newOuterPrec = outerPrec; bool needClose = maybeEmitParens(newOuterPrec, dereferencePrec); m_writer->emit("*"); emitOperand(inst, rightSide(newOuterPrec, dereferencePrec)); -- cgit v1.2.3