From e71e75ab96fab6897f445c96a1de67e528676955 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Tue, 24 Mar 2020 14:04:30 -0700 Subject: Fix some bad behavior around static methods (#1289) These are steps towards a fix for the problem of not being able to call a static method as follows: SomeType::someMethod(); One problem in the above is that the parser gets confused and parses an (anonynmous!) function declaration. This change doesn't address that problem, but *does* fix the problem that when checking fails to coerce `SomeType::someMethod` into a type it was triggering an unimplemented-feature exception rather than a real error message. Another problem was that if the above is re-written to try to avoid the parser bug: (SomeType::someMethod)(); we end up with a call where the base expression (the callee) is a `ParenExpr` and the code for handling calls wasn't expecting that. Instead, it sent the overload resolution logic into an unimplemented case that was bailing by throwing an arbitrary C++ exception instead of emitting a diagnostic. This latter issue was fixed in two ways. First, the code path that failed to emit a diagnostic now emits a reasonable one for the unimplemented feature (this still ends up being a fatal compiler error). Second, we properly handle the case of trying to call a `ParenExpr` by unwrapping it and using the base expression instead, so that `()()` is always treated the same as `()`. --- tests/bugs/static-method.slang | 34 +++++++++++++++++++++++++++++ tests/bugs/static-method.slang.expected.txt | 4 ++++ 2 files changed, 38 insertions(+) create mode 100644 tests/bugs/static-method.slang create mode 100644 tests/bugs/static-method.slang.expected.txt (limited to 'tests') diff --git a/tests/bugs/static-method.slang b/tests/bugs/static-method.slang new file mode 100644 index 000000000..dfb13b4a8 --- /dev/null +++ b/tests/bugs/static-method.slang @@ -0,0 +1,34 @@ +// static-method.slang + +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute + +struct S +{ + static void doThing(in out int x, int y) + { + x += y; + } +} + +//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out +RWStructuredBuffer outputBuffer : register(u0); + +int test(int t) +{ + // TODO: This case is currently being mis-handled by the parser +// S::doThing(t, 0x10); + + (S::doThing(t, 0x200)); + + (S::doThing)(t, 0x4000); + + return t; +} + +[numthreads(4)] +void computeMain(uint3 tid : SV_DispatchThreadID) +{ + int val = tid.x; + val = test(val); + outputBuffer[tid.x] = val; +} diff --git a/tests/bugs/static-method.slang.expected.txt b/tests/bugs/static-method.slang.expected.txt new file mode 100644 index 000000000..017c3bd20 --- /dev/null +++ b/tests/bugs/static-method.slang.expected.txt @@ -0,0 +1,4 @@ +4200 +4201 +4202 +4203 -- cgit v1.2.3