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_GroupIndex:
284 case ParsedAttr::AT_HLSLSV_DispatchThreadID:
287 llvm_unreachable(
"invalid HLSL Annotation");
292 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)