================ @@ -0,0 +1,152 @@ +#include "clang/Parse/ParseHLSLRootSignature.h" + +namespace llvm { +namespace hlsl { +namespace root_signature { + +// Lexer Definitions + +static bool IsPreprocessorNumberChar(char C) { + // TODO: extend for float support with or without hexadecimal/exponent + return isdigit(C); // integer support +} + +bool RootSignatureLexer::LexNumber(RootSignatureToken &Result) { + // NumericLiteralParser does not handle the sign so we will manually apply it + Result.Signed = Buffer.front() == '-'; + if (Result.Signed) + AdvanceBuffer(); + + // Retrieve the possible number + StringRef NumSpelling = Buffer.take_while(IsPreprocessorNumberChar); + + // Parse the numeric value and so semantic checks on its specification + clang::NumericLiteralParser Literal(NumSpelling, SourceLoc, + PP.getSourceManager(), PP.getLangOpts(), + PP.getTargetInfo(), PP.getDiagnostics()); + if (Literal.hadError) + return true; // Error has already been reported so just return + + // Retrieve the number value to store into the token + if (Literal.isIntegerLiteral()) { + Result.Kind = TokenKind::int_literal; + + APSInt X = APSInt(32, Result.Signed); + if (Literal.GetIntegerValue(X)) + return true; // TODO: Report overflow error + + X = Result.Signed ? -X : X; + Result.IntLiteral = (uint32_t)X.getZExtValue(); + } else { + return true; // TODO: report unsupported number literal specification + } ---------------- V-FEXrt wrote:
nit: invert the condition and early exit ```suggestion if (!Literal.isIntegerLiteral()) { return true; // TODO: report unsupported number literal specification } Result.Kind = TokenKind::int_literal; APSInt X = APSInt(32, Result.Signed); if (Literal.GetIntegerValue(X)) return true; // TODO: Report overflow error X = Result.Signed ? -X : X; Result.IntLiteral = (uint32_t)X.getZExtValue(); ``` https://github.com/llvm/llvm-project/pull/122981 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits