diff options
author | Seth Tisue <seth@tisue.net> | 2017-02-16 13:23:08 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-16 13:23:08 -0800 |
commit | 955b779b63d16ab3d2d24b454374c55e9d06c228 (patch) | |
tree | 54d5c176ffa375debb265b0784ea9c298c53081a /src/compiler/scala/tools/nsc/ast/parser/Scanners.scala | |
parent | 7b4567627c2b308866251b88aee3c2e6c72941f1 (diff) | |
parent | a262aaba15effce48fdba95910bef367f89cafca (diff) | |
download | scala-955b779b63d16ab3d2d24b454374c55e9d06c228.tar.gz scala-955b779b63d16ab3d2d24b454374c55e9d06c228.tar.bz2 scala-955b779b63d16ab3d2d24b454374c55e9d06c228.zip |
Merge pull request #5648 from som-snytt/issue/10148
SI-10148 Follow Java for float literals
Diffstat (limited to 'src/compiler/scala/tools/nsc/ast/parser/Scanners.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/Scanners.scala | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala index 99713451ac..226c49ec07 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala @@ -983,23 +983,45 @@ trait Scanners extends ScannersCommon { def intVal: Long = intVal(negated = false) - /** Convert current strVal, base to double value + /** Convert current strVal, base to float value. */ - def floatVal(negated: Boolean): Double = { - val limit: Double = if (token == DOUBLELIT) Double.MaxValue else Float.MaxValue + def floatVal(negated: Boolean): Float = { try { - val value: Double = java.lang.Double.valueOf(strVal).doubleValue() - if (value > limit) + val value: Float = java.lang.Float.parseFloat(strVal) + if (value > Float.MaxValue) syntaxError("floating point number too large") + val zeroly = "0.fF" + if (value == 0.0f && strVal.exists(c => !zeroly.contains(c))) + syntaxError("floating point number too small") if (negated) -value else value } catch { case _: NumberFormatException => syntaxError("malformed floating point number") + 0.0f + } + } + + def floatVal: Float = floatVal(negated = false) + + /** Convert current strVal, base to double value. + */ + def doubleVal(negated: Boolean): Double = { + try { + val value: Double = java.lang.Double.parseDouble(strVal) + if (value > Double.MaxValue) + syntaxError("double precision floating point number too large") + val zeroly = "0.dD" + if (value == 0.0d && strVal.exists(c => !zeroly.contains(c))) + syntaxError("double precision floating point number too small") + if (negated) -value else value + } catch { + case _: NumberFormatException => + syntaxError("malformed double precision floating point number") 0.0 } } - def floatVal: Double = floatVal(negated = false) + def doubleVal: Double = doubleVal(negated = false) def checkNoLetter(): Unit = { if (isIdentifierPart(ch) && ch >= ' ') |