From c5b0708ead5de2d90ef14f20b5b8e3ed4f576373 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Fri, 30 Jun 2023 15:25:59 -0400 Subject: Fix for operator assignment issue (#2951) * WIP handling LValue coercion via LValueImplicitCast * Need to have the ptr type for the cast. * Casting conversion working on C++. * Make the LValue casts record if in or in/out as we can produce better code if we know the difference. * WIP LValueCast pass * Fix tests so we don't fail because downstream compilers detect use of uninitialized variable. * Do conversions through through tmp for l-value scenarios that can't work other ways. * Fix a typo. * Change diagnostic implicit-cast-lvalue for a type that still exhibits the issue. * Add matrix test. * Added a bit more clarity around LValue casting choices. * Small comment improvements. Improvements based on comments on PR. * Use findOuterGeneric. --- source/slang/slang-emit-cpp.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'source/slang/slang-emit-cpp.cpp') diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index 49edec92b..ef9b7f54e 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -1200,6 +1200,20 @@ bool CPPSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOut { return false; } + + case kIROp_InOutImplicitCast: + case kIROp_OutImplicitCast: + { + // We'll just the LValue to be the desired type + m_writer->emit("reinterpret_cast<"); + emitType(inst->getDataType()); + m_writer->emit(">("); + + emitOperand(inst->getOperand(0), getInfo(EmitOp::General)); + + m_writer->emit(")"); + return true; + } case kIROp_MakeVector: { IRType* retType = inst->getFullType(); -- cgit v1.2.3