From a62be597990966b9516995650baf750ee6a0146b Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 20 Feb 2024 15:37:11 -0800 Subject: Support link time type specialization. (#3604) --- source/slang/slang-check-decl.cpp | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'source/slang/slang-check-decl.cpp') diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 3fb2725e2..dc888ccda 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -302,6 +302,8 @@ namespace Slang void visitFunctionDeclBase(FunctionDeclBase* funcDecl); void visitParamDecl(ParamDecl* paramDecl); + + void visitAggTypeDecl(AggTypeDecl* aggTypeDecl); }; template @@ -1705,6 +1707,15 @@ namespace Slang } } + // Propagate type tags. + if (auto parentAggTypeDecl = as(getParentDecl(varDecl))) + { + if (auto varDeclRefType = as(varDecl->type.type)) + { + parentAggTypeDecl->unionTagsWith(getTypeTags(varDecl->type.type)); + } + } + checkVisibility(varDecl); } @@ -1722,11 +1733,20 @@ namespace Slang { addModifier(structDecl, m_astBuilder->create()); } + + if (structDecl->hasModifier()) + { + structDecl->addTag(TypeTag::Incomplete); + } checkVisibility(structDecl); } void SemanticsDeclHeaderVisitor::visitClassDecl(ClassDecl* classDecl) { + if (classDecl->hasModifier()) + { + classDecl->addTag(TypeTag::Incomplete); + } checkVisibility(classDecl); } @@ -1812,6 +1832,13 @@ namespace Slang varDecl->initExpr = CompleteOverloadCandidate(overloadContext, *overloadContext.bestCandidate); } } + if (auto elementType = getBufferElementType(varDecl->getType())) + { + if (doesTypeHaveTag(elementType, TypeTag::Incomplete)) + { + getSink()->diagnose(varDecl->type.exp->loc, Diagnostics::incompleteTypeCannotBeUsedInBuffer, elementType); + } + } maybeRegisterDifferentiableType(getASTBuilder(), varDecl->getType()); } @@ -4784,6 +4811,9 @@ namespace Slang SubtypeWitness* subIsSuperWitness, WitnessTable* witnessTable) { + if (witnessTable->isExtern) + return true; + if (auto supereclRefType = as(superType)) { auto superTypeDeclRef = supereclRefType->getDeclRef(); @@ -4896,6 +4926,7 @@ namespace Slang witnessTable = new WitnessTable(); witnessTable->baseType = superType; witnessTable->witnessedType = subType; + witnessTable->isExtern = parentDecl->hasModifier(); inheritanceDecl->witnessTable = witnessTable; } @@ -5179,6 +5210,7 @@ namespace Slang // order) is allowed to declare a base `class` type. // SLANG_OUTER_SCOPE_CONTEXT_DECL_RAII(this, decl); + Index inheritanceClauseCounter = 0; for (auto inheritanceDecl : decl->getMembersOfType()) { @@ -6544,6 +6576,14 @@ namespace Slang } } + void SemanticsDeclBodyVisitor::visitAggTypeDecl(AggTypeDecl* aggTypeDecl) + { + if (aggTypeDecl->hasTag(TypeTag::Incomplete) && aggTypeDecl->hasModifier()) + { + getSink()->diagnose(aggTypeDecl->loc, Diagnostics::cannotExportIncompleteType, aggTypeDecl); + } + } + void SemanticsDeclHeaderVisitor::cloneModifiers(Decl* dest, Decl* src) { dest->modifiers = src->modifiers; -- cgit v1.2.3