@@ -287,7 +287,7 @@ class DefaultIntArgument<string name, int default> : IntArgument<name, 1> {
287287// possible values, and a list of enumerators to map them to.
288288class EnumArgument<string name, string type, bit is_string, list<string> values,
289289 list<string> enums, bit opt = 0, bit fake = 0,
290- bit isExternalType = 0>
290+ bit isExternalType = 0, bit isCovered = 1 >
291291 : Argument<name, opt, fake> {
292292 string Type = type;
293293 // When true, the argument will be parsed as an unevaluated string literal
@@ -296,13 +296,16 @@ class EnumArgument<string name, string type, bit is_string, list<string> values,
296296 list<string> Values = values;
297297 list<string> Enums = enums;
298298 bit IsExternalType = isExternalType;
299+ // We need to know whether an external enum is fully covered by the options
300+ // in order to decide whether to emit unreachable default labels in a switch.
301+ bit IsCovered = isCovered;
299302}
300303
301304// FIXME: There should be a VariadicArgument type that takes any other type
302305// of argument and generates the appropriate type.
303306class VariadicEnumArgument<string name, string type, bit is_string,
304307 list<string> values, list<string> enums,
305- bit isExternalType = 0>
308+ bit isExternalType = 0, bit isCovered = 1 >
306309 : Argument<name, 1> {
307310 string Type = type;
308311 // When true, the argument will be parsed as an unevaluated string literal
@@ -311,6 +314,9 @@ class VariadicEnumArgument<string name, string type, bit is_string,
311314 list<string> Values = values;
312315 list<string> Enums = enums;
313316 bit IsExternalType = isExternalType;
317+ // We need to know whether an external enum is fully covered by the options
318+ // in order to decide whether to emit unreachable default labels in a switch.
319+ bit IsCovered = isCovered;
314320}
315321
316322// Represents an attribute wrapped by another attribute.
@@ -2913,7 +2919,7 @@ def CodeModel : InheritableAttr, TargetSpecificAttr<TargetLoongArch> {
29132919 let Spellings = [GCC<"model">];
29142920 let Args = [EnumArgument<"Model", "llvm::CodeModel::Model", /*is_string=*/1,
29152921 ["normal", "medium", "extreme"], ["Small", "Medium", "Large"],
2916- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>];
2922+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1, /*isCovered=*/0 >];
29172923 let Subjects = SubjectList<[NonTLSGlobalVar], ErrorDiag>;
29182924 let Documentation = [CodeModelDocs];
29192925}
@@ -4472,7 +4478,7 @@ def HLSLShader : InheritableAttr {
44724478 ["Pixel", "Vertex", "Geometry", "Hull", "Domain", "Compute",
44734479 "RayGeneration", "Intersection", "AnyHit", "ClosestHit",
44744480 "Miss", "Callable", "Mesh", "Amplification"],
4475- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>
4481+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1, /*isCovered=*/0 >
44764482 ];
44774483 let Documentation = [HLSLSV_ShaderTypeAttrDocs];
44784484 let AdditionalMembers =
@@ -4487,30 +4493,31 @@ def HLSLResource : InheritableAttr {
44874493 let Spellings = [];
44884494 let Subjects = SubjectList<[Struct]>;
44894495 let LangOpts = [HLSL];
4490- let Args = [EnumArgument<"ResourceClass", "llvm::hlsl::ResourceClass",
4491- /*is_string=*/0,
4492- ["SRV", "UAV", "CBuffer", "Sampler"],
4493- ["SRV", "UAV", "CBuffer", "Sampler"],
4494- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
4495- EnumArgument<"ResourceKind", "llvm::hlsl::ResourceKind",
4496- /*is_string=*/0,
4497- ["Texture1D", "Texture2D", "Texture2DMS",
4498- "Texture3D", "TextureCube", "Texture1DArray",
4499- "Texture2DArray", "Texture2DMSArray",
4500- "TextureCubeArray", "TypedBuffer", "RawBuffer",
4501- "StructuredBuffer", "CBuffer", "Sampler",
4502- "TBuffer", "RTAccelerationStructure",
4503- "FeedbackTexture2D", "FeedbackTexture2DArray"],
4504- ["Texture1D", "Texture2D", "Texture2DMS",
4505- "Texture3D", "TextureCube", "Texture1DArray",
4506- "Texture2DArray", "Texture2DMSArray",
4507- "TextureCubeArray", "TypedBuffer", "RawBuffer",
4508- "StructuredBuffer", "CBuffer", "Sampler",
4509- "TBuffer", "RTAccelerationStructure",
4510- "FeedbackTexture2D", "FeedbackTexture2DArray"],
4511- /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
4512- DefaultBoolArgument<"isROV", /*default=*/0>
4513- ];
4496+ let Args = [
4497+ EnumArgument<"ResourceClass", "llvm::hlsl::ResourceClass",
4498+ /*is_string=*/0, ["SRV", "UAV", "CBuffer", "Sampler"],
4499+ ["SRV", "UAV", "CBuffer", "Sampler"],
4500+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1>,
4501+ EnumArgument<
4502+ "ResourceKind", "llvm::hlsl::ResourceKind",
4503+ /*is_string=*/0,
4504+ [
4505+ "Texture1D", "Texture2D", "Texture2DMS", "Texture3D", "TextureCube",
4506+ "Texture1DArray", "Texture2DArray", "Texture2DMSArray",
4507+ "TextureCubeArray", "TypedBuffer", "RawBuffer", "StructuredBuffer",
4508+ "CBuffer", "Sampler", "TBuffer", "RTAccelerationStructure",
4509+ "FeedbackTexture2D", "FeedbackTexture2DArray"
4510+ ],
4511+ [
4512+ "Texture1D", "Texture2D", "Texture2DMS", "Texture3D", "TextureCube",
4513+ "Texture1DArray", "Texture2DArray", "Texture2DMSArray",
4514+ "TextureCubeArray", "TypedBuffer", "RawBuffer", "StructuredBuffer",
4515+ "CBuffer", "Sampler", "TBuffer", "RTAccelerationStructure",
4516+ "FeedbackTexture2D", "FeedbackTexture2DArray"
4517+ ],
4518+ /*opt=*/0, /*fake=*/0, /*isExternalType=*/1, /*isCovered=*/0>,
4519+ DefaultBoolArgument<"isROV", /*default=*/0>
4520+ ];
45144521 let Documentation = [InternalOnly];
45154522}
45164523
0 commit comments