summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-decl.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-03-11 14:42:14 -0700
committerGitHub <noreply@github.com>2024-03-11 14:42:14 -0700
commit1bbcf25af514a9ae24f7006747177f2d1b3b7c0d (patch)
treef42c17d32040d033742e741548e7b73ff24a5e92 /source/slang/slang-check-decl.cpp
parent25a7d51445e64253beca5c4f70ddd52f40226b1d (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.cpp50
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;