diff options
Diffstat (limited to 'source/slang/slang-emit.cpp')
| -rw-r--r-- | source/slang/slang-emit.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index e20a4a90f..847c5b55c 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -475,6 +475,31 @@ void calcRequiredLoweringPassSet( } } +void diagnoseCallStack(IRInst* inst, DiagnosticSink* sink) +{ + static const int maxDepth = 5; + for (int i = 0; i < maxDepth; i++) + { + auto func = getParentFunc(inst); + if (!func) + return; + bool shouldContinue = false; + for (auto use = func->firstUse; use; use = use->nextUse) + { + auto user = use->getUser(); + if (auto call = as<IRCall>(user)) + { + sink->diagnose(call, Diagnostics::seeCallOfFunc, func); + inst = call; + shouldContinue = true; + break; + } + } + if (!shouldContinue) + return; + } +} + bool checkStaticAssert(IRInst* inst, DiagnosticSink* sink) { switch (inst->getOp()) @@ -498,6 +523,7 @@ bool checkStaticAssert(IRInst* inst, DiagnosticSink* sink) { sink->diagnose(inst, Diagnostics::staticAssertionFailureWithoutMessage); } + diagnoseCallStack(inst, sink); } } else |
