diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2020-03-24 14:04:30 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-24 14:04:30 -0700 |
| commit | e71e75ab96fab6897f445c96a1de67e528676955 (patch) | |
| tree | a034c36f4f6d78056d1f77117ca1dd9d1debb576 /source/slang/slang-check-type.cpp | |
| parent | 7b4e0e1892bad9f51677b191c69b01aee7403632 (diff) | |
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 `(<func>)(<args>)` is always treated the same as `<func>(<args>)`.
Diffstat (limited to 'source/slang/slang-check-type.cpp')
| -rw-r--r-- | source/slang/slang-check-type.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/source/slang/slang-check-type.cpp b/source/slang/slang-check-type.cpp index 68e14c462..f0ec54061 100644 --- a/source/slang/slang-check-type.cpp +++ b/source/slang/slang-check-type.cpp @@ -86,7 +86,7 @@ namespace Slang return expr; } - getSink()->diagnose(expr, Diagnostics::unimplemented, "expected a type"); + getSink()->diagnose(expr, Diagnostics::expectedAType, expr->type); return CreateErrorExpr(expr); } |
