diff options
| author | Yong He <yonghe@outlook.com> | 2023-11-14 17:46:05 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-14 17:46:05 -0800 |
| commit | 12f7237e4060388494c549623f4a640327b7ca08 (patch) | |
| tree | 407c0f8d20b4ccd49ae5df57f84c8f9a310f7055 /source/slang/slang-check-overload.cpp | |
| parent | c71b12775c8b13ea2b181e42c04b8db55b10fb2f (diff) | |
Add GLSL Compatibility. (#3321)
* Parse glsl buffer blocks to GLSLInterfaceBlockDecl
* Parse glsl local size layout declarations
* Parse (and ignore) glsl version directives
* spelling
* Better l-value interpretation for glsl interface blocks
* Better l-value interpretation for glsl interface blocks
* Add compile flag for enabling glsl
* Parse and ignore precision modifiers.
* Automatically import `glsl` module for compatiblity.
* Complete vector and matrix types for glsl
* Remove generated file from repo
* Bump .gitignore
* do not mark out globals as params
* Synthesize entrypoint layout from global inout vars.
* update test result.
* Allow HLSL semantic on global variables.
* Fix.
* Fix test.
* Fix win32 compile error.
* Add more builtin input/output and texture intrinsics.
* Add struct/array constructor syntax.
* Skip `#extension` lines.
* overide operator * for matrix/vector multiplication.
* Add `matrixCompMult`.
* Parse modifiers in for loop init var declr.
* Add more glsl intrinsics, add stage into to var layout.
* Allow `int[3] x` syntax.
* Fix array type syntax.
---------
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-overload.cpp')
| -rw-r--r-- | source/slang/slang-check-overload.cpp | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp index 27062fc0c..2d7315cd2 100644 --- a/source/slang/slang-check-overload.cpp +++ b/source/slang/slang-check-overload.cpp @@ -2005,13 +2005,25 @@ namespace Slang typeCheckingCache->resolvedOperatorOverloadCache[key] = *context.bestCandidate; return CompleteOverloadCandidate(context, *context.bestCandidate); } - else + else if (auto typetype = as<TypeType>(funcExprType)) { - // Nothing at all was found that we could even consider invoking - getSink()->diagnose(expr->functionExpr, Diagnostics::expectedFunction, funcExprType); - expr->type = QualType(m_astBuilder->getErrorType()); - return expr; - } + // We allow a special case when `funcExpr` represents a composite type, + // in which case we will try to construct the type via memberwise assignment from the arguments. + // + auto initListExpr = m_astBuilder->create<InitializerListExpr>(); + initListExpr->loc = expr->loc; + initListExpr->args.addRange(expr->arguments); + initListExpr->type = m_astBuilder->getInitializerListType(); + Expr* outExpr = nullptr; + if (_coerceInitializerList(typetype->getType(), &outExpr, initListExpr)) + return outExpr; + } + + // Nothing at all was found that we could even consider invoking. + // In all other cases, this is an error. + getSink()->diagnose(expr->functionExpr, Diagnostics::expectedFunction, funcExprType); + expr->type = QualType(m_astBuilder->getErrorType()); + return expr; } void SemanticsVisitor::AddGenericOverloadCandidate( |
