diff options
| author | Yong He <yonghe@outlook.com> | 2022-08-04 14:05:02 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-04 14:05:02 -0700 |
| commit | 11b29eff99910d55a54658b8a1d053cc4ec076fc (patch) | |
| tree | ac82bef698df94f74a788cdc160dfd30472fb601 /source/slang/slang-emit-c-like.cpp | |
| parent | e43ef82e288afe486f45ef2736d378e88f40cc90 (diff) | |
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 <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
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<IRFieldAddress>(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)); |
