diff options
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
| -rw-r--r-- | source/slang/slang-check-modifier.cpp | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index f977721dd..7e11ee3ca 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -292,7 +292,7 @@ namespace Slang bool SemanticsVisitor::validateAttribute(Attribute* attr, AttributeDecl* attribClassDecl, ModifiableSyntaxNode* attrTarget) { - if(auto numThreadsAttr = as<NumThreadsAttribute>(attr)) + if (auto numThreadsAttr = as<NumThreadsAttribute>(attr)) { SLANG_ASSERT(attr->args.getCount() == 3); @@ -320,9 +320,9 @@ namespace Slang values[i] = value; } - numThreadsAttr->x = values[0]; - numThreadsAttr->y = values[1]; - numThreadsAttr->z = values[2]; + numThreadsAttr->x = values[0]; + numThreadsAttr->y = values[1]; + numThreadsAttr->z = values[2]; } else if (auto anyValueSizeAttr = as<AnyValueSizeAttribute>(attr)) { @@ -368,7 +368,7 @@ namespace Slang { return false; } - + bindingAttr->binding = int32_t(binding->value); bindingAttr->set = int32_t(set->value); } @@ -395,31 +395,31 @@ namespace Slang SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if(!val) return false; + if (!val) return false; maxVertexCountAttr->value = (int32_t)val->value; } - else if(auto instanceAttr = as<InstanceAttribute>(attr)) + else if (auto instanceAttr = as<InstanceAttribute>(attr)) { SLANG_ASSERT(attr->args.getCount() == 1); auto val = checkConstantIntVal(attr->args[0]); - if(!val) return false; + if (!val) return false; instanceAttr->value = (int32_t)val->value; } - else if(auto entryPointAttr = as<EntryPointAttribute>(attr)) + else if (auto entryPointAttr = as<EntryPointAttribute>(attr)) { SLANG_ASSERT(attr->args.getCount() == 1); String stageName; - if(!checkLiteralStringVal(attr->args[0], &stageName)) + if (!checkLiteralStringVal(attr->args[0], &stageName)) { return false; } auto stage = findStageByName(stageName); - if(stage == Stage::Unknown) + if (stage == Stage::Unknown) { getSink()->diagnose(attr->args[0], Diagnostics::unknownStageName, stageName); } @@ -427,10 +427,10 @@ namespace Slang entryPointAttr->stage = stage; } else if ((as<DomainAttribute>(attr)) || - (as<MaxTessFactorAttribute>(attr)) || - (as<OutputTopologyAttribute>(attr)) || - (as<PartitioningAttribute>(attr)) || - (as<PatchConstantFuncAttribute>(attr))) + (as<MaxTessFactorAttribute>(attr)) || + (as<OutputTopologyAttribute>(attr)) || + (as<PartitioningAttribute>(attr)) || + (as<PatchConstantFuncAttribute>(attr))) { // Let it go thru iff single string attribute if (!hasStringArgs(attr, 1)) @@ -439,7 +439,7 @@ namespace Slang } } else if (as<OutputControlPointsAttribute>(attr) || - as<SPIRVInstructionOpAttribute>(attr)) + as<SPIRVInstructionOpAttribute>(attr)) { // Let it go thru iff single integral attribute if (!hasIntArgs(attr, 1)) @@ -484,6 +484,27 @@ namespace Slang return false; } } + else if (auto builtinAssocTypeAttr = as<BuiltinAssociatedTypeRequirementAttribute>(attr)) + { + if (attr->args.getCount() == 1) + { + //IntVal* outIntVal; + if (auto cInt = checkConstantEnumVal(attr->args[0])) + { + builtinAssocTypeAttr->kind = (BuiltinAssociatedTypeRequirementKind)(cInt->value); + } + else + { + getSink()->diagnose(attr, Diagnostics::expectedSingleIntArg, attr->keywordName); + return false; + } + } + else + { + getSink()->diagnose(attr, Diagnostics::expectedSingleIntArg, attr->keywordName); + return false; + } + } else if (auto unrollAttr = as<UnrollAttribute>(attr)) { // Check has an argument. We need this because default behavior is to give an error |
