diff options
| author | Yong He <yonghe@outlook.com> | 2024-03-11 14:42:14 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-11 14:42:14 -0700 |
| commit | 1bbcf25af514a9ae24f7006747177f2d1b3b7c0d (patch) | |
| tree | f42c17d32040d033742e741548e7b73ff24a5e92 /source/slang/slang-check-decl.cpp | |
| parent | 25a7d51445e64253beca5c4f70ddd52f40226b1d (diff) | |
Link-time specialization fixes. (#3734)
* Fix method synthesis logic for static differentiable methods.
* Support link-time constants in thread group size reflection.
Diffstat (limited to 'source/slang/slang-check-decl.cpp')
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 8dee7b0c5..39f7de89a 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -1538,7 +1538,6 @@ namespace Slang varDecl->initExpr = initExpr; varDecl->type.type = initExpr->type; - _validateCircularVarDefinition(varDecl); } @@ -1602,6 +1601,19 @@ namespace Slang } } + if (varDecl->initExpr) + { + if (as<BasicExpressionType>(varDecl->type.type)) + { + auto parentDecl = getParentDecl(varDecl); + if (varDecl->findModifier<ConstModifier>() && + (as<NamespaceDeclBase>(parentDecl) || as<FileDecl>(parentDecl) || varDecl->findModifier<HLSLStaticModifier>())) + { + varDecl->val = tryConstantFoldExpr(varDecl->initExpr, ConstantFoldingKind::LinkTime, nullptr); + } + } + } + checkMeshOutputDecl(varDecl); // The NVAPI library allows user code to express extended operations @@ -3559,24 +3571,24 @@ namespace Slang auto noDiffThisAttr = m_astBuilder->create<NoDiffThisAttribute>(); addModifier(synFuncDecl, noDiffThisAttr); } - if (requiredMemberDeclRef.getDecl()->hasModifier<ForwardDifferentiableAttribute>()) - { - auto attr = m_astBuilder->create<ForwardDifferentiableAttribute>(); - addModifier(synFuncDecl, attr); - } - if (requiredMemberDeclRef.getDecl()->hasModifier<BackwardDifferentiableAttribute>()) - { - auto attr = m_astBuilder->create<BackwardDifferentiableAttribute>(); - addModifier(synFuncDecl, attr); - } - // The visibility of synthesized decl should be the min of the parent decl and the requirement. - if (requiredMemberDeclRef.getDecl()->findModifier<VisibilityModifier>()) - { - auto requirementVisibility = getDeclVisibility(requiredMemberDeclRef.getDecl()); - auto thisVisibility = getDeclVisibility(context->parentDecl); - auto visibility = Math::Min(thisVisibility, requirementVisibility); - addVisibilityModifier(m_astBuilder, synFuncDecl, visibility); - } + } + if (requiredMemberDeclRef.getDecl()->hasModifier<ForwardDifferentiableAttribute>()) + { + auto attr = m_astBuilder->create<ForwardDifferentiableAttribute>(); + addModifier(synFuncDecl, attr); + } + if (requiredMemberDeclRef.getDecl()->hasModifier<BackwardDifferentiableAttribute>()) + { + auto attr = m_astBuilder->create<BackwardDifferentiableAttribute>(); + addModifier(synFuncDecl, attr); + } + // The visibility of synthesized decl should be the min of the parent decl and the requirement. + if (requiredMemberDeclRef.getDecl()->findModifier<VisibilityModifier>()) + { + auto requirementVisibility = getDeclVisibility(requiredMemberDeclRef.getDecl()); + auto thisVisibility = getDeclVisibility(context->parentDecl); + auto visibility = Math::Min(thisVisibility, requirementVisibility); + addVisibilityModifier(m_astBuilder, synFuncDecl, visibility); } return synFuncDecl; |
