================ @@ -0,0 +1,173 @@ +#include "clang/Parse/ParseHLSLRootSignature.h" + +namespace clang { +namespace hlsl { + +// Lexer Definitions + +static bool IsNumberChar(char C) { + // TODO(#120472): extend for float support exponents + return isdigit(C); // integer support +} + +bool RootSignatureLexer::LexNumber(RootSignatureToken &Result) { + // NumericLiteralParser does not handle the sign so we will manually apply it + bool Negative = Buffer.front() == '-'; + bool Signed = Negative || Buffer.front() == '+'; + if (Signed) + AdvanceBuffer(); + + // Retrieve the possible number + StringRef NumSpelling = Buffer.take_while(IsNumberChar); + + // Catch this now as the Literal Parser will accept it as valid + if (NumSpelling.empty()) { + PP.getDiagnostics().Report(Result.TokLoc, + diag::err_hlsl_invalid_number_literal); + return true; + } + + // Parse the numeric value and do 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 + + if (!Literal.isIntegerLiteral()) { + // Note: if IsNumberChar allows for hexidecimal we will need to turn this + // into a diagnostics for potential fixed-point literals + llvm_unreachable("IsNumberChar will only support digits"); + return true; + } + + // Retrieve the number value to store into the token + Result.Kind = TokenKind::int_literal; + + llvm::APSInt X = llvm::APSInt(32, !Signed); ---------------- bogner wrote:
What happens if we have a value like `+2147483648`? This would fit in an unsigned 32-bit int, but not a signed one. However, we're deciding that the value is signed if the `+` is present above. Will this error and tell us that there's overflow, treat the value as unsigned because of the range, or give us a garbage negative number? If it's one of the first two options, does the one we're implementing match DXC's behaviour here? 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