33 if (isa<CXXRecordDecl, RecordDecl, FunctionDecl, VarDecl>(
D))
37 if (isa<HLSLBufferDecl, NamespaceDecl>(
D)) {
38 P.Diag(
D->
getLocation(), diag::err_invalid_declaration_in_hlsl_buffer)
45 P.Diag(
D->
getLocation(), diag::err_invalid_declaration_in_hlsl_buffer)
52 assert((Tok.
is(tok::kw_cbuffer) || Tok.
is(tok::kw_tbuffer)) &&
53 "Not a cbuffer or tbuffer!");
54 bool IsCBuffer = Tok.
is(tok::kw_cbuffer);
57 if (!Tok.
is(tok::identifier)) {
58 Diag(Tok, diag::err_expected) << tok::identifier;
66 MaybeParseHLSLAnnotations(Attrs,
nullptr);
70 if (
T.consumeOpen()) {
71 Diag(Tok, diag::err_expected) << tok::l_brace;
79 while (Tok.
isNot(tok::r_brace) && Tok.
isNot(tok::eof)) {
85 ParseExternalDeclaration(DeclAttrs, EmptyDeclSpecAttrs);
89 DeclEnd =
T.getCloseLocation();
97 DeclEnd =
T.getCloseLocation();
113 std::string FixedArg = ArgStr.str() +
Num.str();
114 P.Diag(ArgLoc, diag::err_hlsl_separate_attr_arg_and_number)
123 bool CouldBeBitField) {
125 assert(Tok.
is(tok::colon) &&
"Not a HLSL Annotation");
126 Token OldToken = Tok;
130 if (Tok.
is(tok::kw_register))
132 else if (Tok.
is(tok::identifier))
136 if (CouldBeBitField) {
137 UnconsumeToken(OldToken);
152 case ParsedAttr::AT_HLSLResourceBinding: {
153 if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after)) {
157 if (!Tok.
is(tok::identifier)) {
164 ArgExprs.push_back(ParseIdentifierLoc());
167 if (SlotStr.size() == 1 && Tok.
is(tok::numeric_constant))
171 if (Tok.
is(tok::comma)) {
173 if (!Tok.
is(tok::identifier)) {
180 ArgExprs.push_back(ParseIdentifierLoc());
183 if (SpaceStr ==
"space" && Tok.
is(tok::numeric_constant))
187 if (ExpectAndConsume(tok::r_paren, diag::err_expected)) {
192 case ParsedAttr::AT_HLSLPackOffset: {
195 if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after)) {
200 if (!Tok.
is(tok::identifier)) {
207 if (OffsetStr[0] !=
'c') {
213 OffsetStr = OffsetStr.substr(1);
214 unsigned SubComponent = 0;
215 if (!OffsetStr.empty()) {
217 if (OffsetStr.getAsInteger(10, SubComponent)) {
219 diag::err_hlsl_unsupported_register_number);
224 unsigned Component = 0;
227 if (Tok.
is(tok::period)) {
229 if (!Tok.
is(tok::identifier)) {
238 if (ComponentStr.size() != 1) {
239 Diag(ComponentLoc, diag::err_hlsl_unsupported_component)
244 switch (ComponentStr[0]) {
262 Diag(ComponentLoc, diag::err_hlsl_unsupported_component)
272 Ctx, llvm::APInt(SizeTySize, SubComponent), SizeTy, SubComponentLoc));
274 Ctx, llvm::APInt(SizeTySize, Component), SizeTy, ComponentLoc));
275 if (ExpectAndConsume(tok::r_paren, diag::err_expected)) {
281 Diag(
Loc, diag::err_unknown_hlsl_semantic) << II;
283 case ParsedAttr::AT_HLSLSV_GroupThreadID:
284 case ParsedAttr::AT_HLSLSV_GroupID:
285 case ParsedAttr::AT_HLSLSV_GroupIndex:
286 case ParsedAttr::AT_HLSLSV_DispatchThreadID:
289 llvm_unreachable(
"invalid HLSL Annotation");
294 ArgExprs.size(), ParsedAttr::Form::HLSLAnnotation());
static bool validateDeclsInsideHLSLBuffer(Parser::DeclGroupPtrTy DG, SourceLocation BufferLoc, bool IsCBuffer, Parser &P)
static void fixSeparateAttrArgAndNumber(StringRef ArgStr, SourceLocation ArgLoc, Token Tok, ArgsVector &ArgExprs, Parser &P, ASTContext &Ctx, Preprocessor &PP)
This file declares semantic analysis for HLSL constructs.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
@ AS_HLSLAnnotation
<vardecl> : <annotation>
Kind getParsedKind() const
RAII class that helps handle the parsing of an open/close delimiter pair, such as braces { ....
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Wrapper for void* pointer.
ParsedAttributes - A collection of parsed attributes.
ParsedAttr * addNew(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, ArgsUnion *args, unsigned numArgs, ParsedAttr::Form form, SourceLocation ellipsisLoc=SourceLocation())
Add attribute with expression arguments.
Parser - This implements a parser for the C family of languages.
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
SourceLocation ConsumeToken()
ConsumeToken - Consume the current 'peek token' and lex the next one.
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Scope * getCurScope() const