xref: /freebsd-src/contrib/llvm-project/clang/lib/Parse/ParseHLSL.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1*81ad6265SDimitry Andric //===--- ParseHLSL.cpp - HLSL-specific parsing support --------------------===//
2*81ad6265SDimitry Andric //
3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric //
7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric //
9*81ad6265SDimitry Andric // This file implements the parsing logic for HLSL language features.
10*81ad6265SDimitry Andric //
11*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
12*81ad6265SDimitry Andric 
13*81ad6265SDimitry Andric #include "clang/Basic/AttributeCommonInfo.h"
14*81ad6265SDimitry Andric #include "clang/Parse/ParseDiagnostic.h"
15*81ad6265SDimitry Andric #include "clang/Parse/Parser.h"
16*81ad6265SDimitry Andric 
17*81ad6265SDimitry Andric using namespace clang;
18*81ad6265SDimitry Andric 
19*81ad6265SDimitry Andric void Parser::ParseHLSLSemantics(ParsedAttributes &Attrs,
20*81ad6265SDimitry Andric                                 SourceLocation *EndLoc) {
21*81ad6265SDimitry Andric   assert(Tok.is(tok::colon) && "Not a HLSL Semantic");
22*81ad6265SDimitry Andric   ConsumeToken();
23*81ad6265SDimitry Andric 
24*81ad6265SDimitry Andric   if (!Tok.is(tok::identifier)) {
25*81ad6265SDimitry Andric     Diag(Tok.getLocation(), diag::err_expected_semantic_identifier);
26*81ad6265SDimitry Andric     return;
27*81ad6265SDimitry Andric   }
28*81ad6265SDimitry Andric 
29*81ad6265SDimitry Andric   IdentifierInfo *II = Tok.getIdentifierInfo();
30*81ad6265SDimitry Andric   SourceLocation Loc = ConsumeToken();
31*81ad6265SDimitry Andric   if (EndLoc)
32*81ad6265SDimitry Andric     *EndLoc = Tok.getLocation();
33*81ad6265SDimitry Andric   ParsedAttr::Kind AttrKind =
34*81ad6265SDimitry Andric       ParsedAttr::getParsedKind(II, nullptr, ParsedAttr::AS_HLSLSemantic);
35*81ad6265SDimitry Andric 
36*81ad6265SDimitry Andric   if (AttrKind == ParsedAttr::UnknownAttribute) {
37*81ad6265SDimitry Andric     Diag(Loc, diag::err_unknown_hlsl_semantic) << II;
38*81ad6265SDimitry Andric     return;
39*81ad6265SDimitry Andric   }
40*81ad6265SDimitry Andric   Attrs.addNew(II, Loc, nullptr, SourceLocation(), nullptr, 0,
41*81ad6265SDimitry Andric                ParsedAttr::AS_HLSLSemantic);
42*81ad6265SDimitry Andric }
43