diff options
| author | Copilot <198982749+Copilot@users.noreply.github.com> | 2025-08-08 00:34:05 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-08 00:34:05 +0000 |
| commit | c7c4816146bb9ec055e9a8f8c3f975624f2fdb07 (patch) | |
| tree | a18bc755bf281e31b228df1a37db7c3752d2db12 /tools | |
| parent | e595743b5aa4f6bd88800cfbcfd6eead3cc3d01b (diff) | |
Fix FunctionReflection getName() returning null for overloaded functions (#8113)
When using Slang reflection API to find functions by name in a type,
`FunctionReflection::getName()` would return `nullptr` for overloaded
functions instead of the expected function name.
The issue occurred in `spReflectionFunction_GetName` when
`findFunctionByNameInType` returned a `SlangReflectionFunction` wrapping
an `OverloadedExpr` (for overloaded functions) instead of a single
`DeclRef<FunctionDeclBase>`. The `convertToFunc()` function would fail
for `OverloadedExpr` objects, causing `getName()` to return `nullptr`.
**Example of the bug:**
```cpp
// This code would fail before the fix
public interface IBase {
public void step(inout float f);
}
public struct Impl : IBase {
public void step(inout float f) { f += 1.0f; }
}
// Using reflection API:
auto implType = reflection->findTypeByName("Impl");
auto stepFunction = reflection->findFunctionByNameInType(implType, "step");
auto name = stepFunction->getName(); // Would return nullptr
```
**Fix:**
Modified `spReflectionFunction_GetName` to handle overloaded functions
by falling back to the name of the first overload candidate when
`convertToFunc` fails. This follows the same pattern already used by
`spReflectionFunction_specializeWithArgTypes`.
The fix ensures that:
- Overloaded function containers return the correct function name
- Individual overload candidates also return their names correctly
- Non-overloaded functions continue to work as before
- No regression in existing functionality
**Testing:**
Added comprehensive test cases covering both the original issue scenario
and explicit function overloading. All existing reflection tests
continue to pass.
Fixes #8047.
<!-- START COPILOT CODING AGENT TIPS -->
---
💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: csyonghe <2652293+csyonghe@users.noreply.github.com>
Co-authored-by: Yong He <yonghe@outlook.com>
Co-authored-by: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com>
Co-authored-by: slangbot <ellieh+slangbot@nvidia.com>
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/slang-unit-test/unit-test-function-lookup-resolution.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/tools/slang-unit-test/unit-test-function-lookup-resolution.cpp b/tools/slang-unit-test/unit-test-function-lookup-resolution.cpp index 539c9ac48..c88ca7760 100644 --- a/tools/slang-unit-test/unit-test-function-lookup-resolution.cpp +++ b/tools/slang-unit-test/unit-test-function-lookup-resolution.cpp @@ -75,6 +75,9 @@ SLANG_UNIT_TEST(functionLookupResolution) auto func1 = layout->findFunctionByNameInType(type, "method"); SLANG_CHECK_ABORT(func1->isOverloaded()); SLANG_CHECK(func1->getOverloadCount() == 3); + // Test that overloaded function containers return the correct name + SLANG_CHECK(func1->getName() != nullptr); + SLANG_CHECK(String(func1->getName()) == "method"); if (func1->isOverloaded()) { List<slang::FunctionReflection*> candidates; |
