llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-hlsl Author: Joshua Batista (bob80905) <details> <summary>Changes</summary> `MaybeParseHLSLAnnotations` should be run on Field Decls instead of just assuming that any colon after a field decl is a bitfield. In the case that HLSL is the language, the code after the colon may be an annotation. This PR gives the parser a chance to parse the subsequent text as if it was an HLSL annotation. --- Full diff: https://github.com/llvm/llvm-project/pull/96346.diff 2 Files Affected: - (modified) clang/lib/Parse/ParseDeclCXX.cpp (+3) - (added) clang/test/ParserHLSL/hlsl_annotations_on_struct_members.hlsl (+30) ``````````diff diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index d02548f6441f9..c4a4657cbd04f 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -2646,6 +2646,9 @@ bool Parser::ParseCXXMemberDeclaratorBeforeInitializer( else DeclaratorInfo.SetIdentifier(nullptr, Tok.getLocation()); + if (getLangOpts().HLSL) + MaybeParseHLSLAnnotations(DeclaratorInfo); + if (!DeclaratorInfo.isFunctionDeclarator() && TryConsumeToken(tok::colon)) { assert(DeclaratorInfo.isPastIdentifier() && "don't know where identifier would go yet?"); diff --git a/clang/test/ParserHLSL/hlsl_annotations_on_struct_members.hlsl b/clang/test/ParserHLSL/hlsl_annotations_on_struct_members.hlsl new file mode 100644 index 0000000000000..f1e258b0d853c --- /dev/null +++ b/clang/test/ParserHLSL/hlsl_annotations_on_struct_members.hlsl @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -o - %s -verify + +// previously, this test would result in an error shown below on the line that +// declares variable a in struct Eg9: +// error: use of undeclared identifier +// 'SV_DispatchThreadID' +// This is because the annotation is parsed as if it was a c++ bit field, and an identifier +// that represents an integer is expected, but not found. + +// This test ensures that hlsl annotations are attempted to be parsed when parsing struct decls. +// Ideally, we'd validate this behavior by ensuring the annotation is parsed and properly +// attached as an attribute to the member in the struct in the AST. However, in this case +// this can't happen presently because there are other issues with annotations on field decls. +// This test just ensures we make progress by moving the validation error from the realm of +// C++ and expecting bitfields, to HLSL and a specialized error for the recognized annotation. + +struct Eg9{ +// expected-error@+1{{attribute 'SV_DispatchThreadID' only applies to parameter}} + int a : SV_DispatchThreadID; +}; +Eg9 e9; + + +RWBuffer<int> In : register(u1); + + +[numthreads(1,1,1)] +void main() { + In[0] = e9.a; +} `````````` </details> https://github.com/llvm/llvm-project/pull/96346 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits