From: Leonard Chan Date: Wed, 27 May 2020 23:16:56 +0000 (-0700) Subject: [Lexer] Fix invalid suffix diagnostic for fixed-point literals X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ef37444058550b0f49441b994c9e9368d8e42da8;p=android-x86%2Fexternal-llvm-project.git [Lexer] Fix invalid suffix diagnostic for fixed-point literals Committing on behalf of nagart, who authored this patch. Differential Revision: https://reviews.llvm.org/D80412 --- diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index ef90bdf84c8..fa07e9ae76c 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -175,7 +175,7 @@ def ext_unknown_escape : ExtWarn<"unknown escape sequence '\\%0'">, def err_invalid_digit : Error< "invalid digit '%0' in %select{decimal|octal|binary}1 constant">; def err_invalid_suffix_constant : Error< - "invalid suffix '%0' on %select{integer|floating}1 constant">; + "invalid suffix '%0' on %select{integer|floating|fixed-point}1 constant">; def warn_cxx11_compat_digit_separator : Warning< "digit separators are incompatible with C++ standards before C++14">, InGroup, DefaultIgnore; diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h index b9d64c24a00..6829771b283 100644 --- a/clang/include/clang/Lex/LiteralSupport.h +++ b/clang/include/clang/Lex/LiteralSupport.h @@ -71,7 +71,9 @@ public: bool isFract : 1; // 1.0hr/r/lr/uhr/ur/ulr bool isAccum : 1; // 1.0hk/k/lk/uhk/uk/ulk - bool isFixedPointLiteral() const { return saw_fixed_point_suffix; } + bool isFixedPointLiteral() const { + return (saw_period || saw_exponent) && saw_fixed_point_suffix; + } bool isIntegerLiteral() const { return !saw_period && !saw_exponent && !isFixedPointLiteral(); diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 2b1add4d9b9..f44614b4bec 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -583,6 +583,7 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, // Parse the suffix. At this point we can classify whether we have an FP or // integer constant. + bool isFixedPointConstant = isFixedPointLiteral(); bool isFPConstant = isFloatingLiteral(); // Loop over all of the characters of the suffix. If we see something bad, @@ -737,7 +738,8 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, // Report an error if there are any. PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, SuffixBegin - ThisTokBegin), diag::err_invalid_suffix_constant) - << StringRef(SuffixBegin, ThisTokEnd - SuffixBegin) << isFPConstant; + << StringRef(SuffixBegin, ThisTokEnd - SuffixBegin) + << (isFixedPointConstant ? 2 : isFPConstant); hadError = true; } } diff --git a/clang/test/Frontend/fixed_point_errors.c b/clang/test/Frontend/fixed_point_errors.c index db15bd874b3..9b600fbc264 100644 --- a/clang/test/Frontend/fixed_point_errors.c +++ b/clang/test/Frontend/fixed_point_errors.c @@ -137,15 +137,15 @@ _Sat longfract_t td_sat_long_fract; // expected-error{{'_Sat' specifier _Sat longaccum_t td_sat_long_accum; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}} /* Bad suffixes */ -_Accum fk = 1.0fk; // expected-error{{invalid suffix 'fk' on integer constant}} -_Accum kk = 1.0kk; // expected-error{{invalid suffix 'kk' on integer constant}} -_Accum rk = 1.0rk; // expected-error{{invalid suffix 'rk' on integer constant}} -_Accum rk = 1.0rr; // expected-error{{invalid suffix 'rr' on integer constant}} -_Accum qk = 1.0qr; // expected-error{{invalid suffix 'qr' on integer constant}} +_Accum fk = 1.0fk; // expected-error{{invalid suffix 'fk' on fixed-point constant}} +_Accum kk = 1.0kk; // expected-error{{invalid suffix 'kk' on fixed-point constant}} +_Accum rk = 1.0rk; // expected-error{{invalid suffix 'rk' on fixed-point constant}} +_Accum rk = 1.0rr; // expected-error{{invalid suffix 'rr' on fixed-point constant}} +_Accum qk = 1.0qr; // expected-error{{invalid suffix 'qr' on fixed-point constant}} /* Using wrong exponent notation */ -_Accum dec_with_hex_exp1 = 0.1p10k; // expected-error{{invalid suffix 'p10k' on integer constant}} -_Accum dec_with_hex_exp2 = 0.1P10k; // expected-error{{invalid suffix 'P10k' on integer constant}} +_Accum dec_with_hex_exp1 = 0.1p10k; // expected-error{{invalid suffix 'p10k' on fixed-point constant}} +_Accum dec_with_hex_exp2 = 0.1P10k; // expected-error{{invalid suffix 'P10k' on fixed-point constant}} _Accum hex_with_dex_exp1 = 0x0.1e10k; // expected-error{{hexadecimal floating constant requires an exponent}} _Accum hex_with_dex_exp2 = 0x0.1E10k; // expected-error{{hexadecimal floating constant requires an exponent}}