@@ -862,8 +862,11 @@ void Lexer::lexHexNumber() {
862
862
if (*CurPtr != ' .' && *CurPtr != ' p' && *CurPtr != ' P' )
863
863
return formToken (tok::integer_literal, TokStart);
864
864
865
+ const char *PtrOnDot = nullptr ;
866
+
865
867
// (\.[0-9A-Fa-f][0-9A-Fa-f_]*)?
866
868
if (*CurPtr == ' .' ) {
869
+ PtrOnDot = CurPtr;
867
870
++CurPtr;
868
871
869
872
// If the character after the '.' is not a digit, assume we have an int
@@ -876,6 +879,11 @@ void Lexer::lexHexNumber() {
876
879
while (isHexDigit (*CurPtr) || *CurPtr == ' _' )
877
880
++CurPtr;
878
881
if (*CurPtr != ' p' && *CurPtr != ' P' ) {
882
+ if (!isDigit (PtrOnDot[1 ])) {
883
+ // e.g: 0xff.description
884
+ CurPtr = PtrOnDot;
885
+ return formToken (tok::integer_literal, TokStart);
886
+ }
879
887
diagnose (CurPtr, diag::lex_expected_binary_exponent_in_hex_float_literal);
880
888
return formToken (tok::unknown, TokStart);
881
889
}
@@ -885,10 +893,19 @@ void Lexer::lexHexNumber() {
885
893
assert (*CurPtr == ' p' || *CurPtr == ' P' && " not at a hex float exponent?!" );
886
894
++CurPtr;
887
895
888
- if (*CurPtr == ' +' || *CurPtr == ' -' )
896
+ bool signedExponent = false ;
897
+ if (*CurPtr == ' +' || *CurPtr == ' -' ) {
889
898
++CurPtr; // Eat the sign.
899
+ signedExponent = true ;
900
+ }
890
901
891
902
if (!isDigit (*CurPtr)) {
903
+ if (PtrOnDot && !isDigit (PtrOnDot[1 ]) && !signedExponent) {
904
+ // e.g: 0xff.fpValue, 0xff.fp
905
+ CurPtr = PtrOnDot;
906
+ return formToken (tok::integer_literal, TokStart);
907
+ }
908
+ // Note: 0xff.fp+otherExpr can be valid expression. But we don't accept it.
892
909
diagnose (CurPtr, diag::lex_expected_digit_in_fp_exponent);
893
910
return formToken (tok::unknown, TokStart);
894
911
}
0 commit comments