summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
diff options
context:
space:
mode:
authorSeth Tisue <seth@tisue.net>2017-02-16 13:23:08 -0800
committerGitHub <noreply@github.com>2017-02-16 13:23:08 -0800
commit955b779b63d16ab3d2d24b454374c55e9d06c228 (patch)
tree54d5c176ffa375debb265b0784ea9c298c53081a /src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
parent7b4567627c2b308866251b88aee3c2e6c72941f1 (diff)
parenta262aaba15effce48fdba95910bef367f89cafca (diff)
downloadscala-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.scala34
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 >= ' ')