summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-08-04 14:05:02 -0700
committerGitHub <noreply@github.com>2022-08-04 14:05:02 -0700
commit11b29eff99910d55a54658b8a1d053cc4ec076fc (patch)
treeac82bef698df94f74a788cdc160dfd30472fb601 /source/slang/slang-emit-c-like.cpp
parente43ef82e288afe486f45ef2736d378e88f40cc90 (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.cpp31
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));