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)
124 assert(Tok.
is(tok::colon) &&
"Not a HLSL Annotation");
128 if (Tok.
is(tok::kw_register))
130 else if (Tok.
is(tok::identifier))
146 case ParsedAttr::AT_HLSLResourceBinding: {
147 if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after)) {
151 if (!Tok.
is(tok::identifier)) {
158 ArgExprs.push_back(ParseIdentifierLoc());
161 if (SlotStr.size() == 1 && Tok.
is(tok::numeric_constant))
165 if (Tok.
is(tok::comma)) {
167 if (!Tok.
is(tok::identifier)) {
174 ArgExprs.push_back(ParseIdentifierLoc());
177 if (SpaceStr ==
"space" && Tok.
is(tok::numeric_constant))
181 if (ExpectAndConsume(tok::r_paren, diag::err_expected)) {
186 case ParsedAttr::AT_HLSLPackOffset: {
189 if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after)) {
194 if (!Tok.
is(tok::identifier)) {
201 if (OffsetStr[0] !=
'c') {
207 OffsetStr = OffsetStr.substr(1);
208 unsigned SubComponent = 0;
209 if (!OffsetStr.empty()) {
211 if (OffsetStr.getAsInteger(10, SubComponent)) {
213 diag::err_hlsl_unsupported_register_number);
218 unsigned Component = 0;
221 if (Tok.
is(tok::period)) {
223 if (!Tok.
is(tok::identifier)) {
232 if (ComponentStr.size() != 1) {
233 Diag(ComponentLoc, diag::err_hlsl_unsupported_component)
238 switch (ComponentStr[0]) {
256 Diag(ComponentLoc, diag::err_hlsl_unsupported_component)
266 Ctx, llvm::APInt(SizeTySize, SubComponent), SizeTy, SubComponentLoc));
268 Ctx, llvm::APInt(SizeTySize, Component), SizeTy, ComponentLoc));
269 if (ExpectAndConsume(tok::r_paren, diag::err_expected)) {
275 Diag(
Loc, diag::err_unknown_hlsl_semantic) << II;
277 case ParsedAttr::AT_HLSLSV_GroupIndex:
278 case ParsedAttr::AT_HLSLSV_DispatchThreadID:
281 llvm_unreachable(
"invalid HLSL Annotation");
286 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
bool SkipUntil(tok::TokenKind T, SkipUntilFlags Flags=static_cast< SkipUntilFlags >(0))
SkipUntil - Read tokens until we get to the specified token, then consume it (unless StopBeforeMatch ...
@ StopAtSemi
Stop skipping at semicolon.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
A (possibly-)qualified type.
@ DeclScope
This is a scope that can contain a declaration.
void ActOnFinishBuffer(Decl *Dcl, SourceLocation RBrace)
Decl * ActOnStartBuffer(Scope *BufferScope, bool CBuffer, SourceLocation KwLoc, IdentifierInfo *Ident, SourceLocation IdentLoc, SourceLocation LBrace)
ASTContext & getASTContext() const
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
Encodes a location in the source.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
A trivial tuple used to represent a source range.
Token - This structure provides full information about a lexed token.
IdentifierInfo * getIdentifierInfo() const
SourceLocation getEndLoc() const
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file.
unsigned getLength() const
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isNot(tok::TokenKind K) const
const char * getLiteralData() const
getLiteralData - For a literal token (numeric constant, string, etc), this returns a pointer to the s...
The JSON file list parser is used to communicate input to InstallAPI.
llvm::PointerUnion< Expr *, IdentifierLoc * > ArgsUnion
A union of the various pointer types that can be passed to an ParsedAttr as an argument.
@ Result
The result type of a method or function.
const FunctionProtoType * T
Wraps an identifier and optional source location for the identifier.
static IdentifierLoc * create(ASTContext &Ctx, SourceLocation Loc, IdentifierInfo *Ident)