Merge pull request #22022 from Kingwl/enum-eval-div-zero

disallow nan and infinity in enum member
This commit is contained in:
Mohamed Hegazy 2018-05-23 15:32:35 -07:00 committed by GitHub
commit 10ac8b47e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 262 additions and 3 deletions

View File

@ -24752,7 +24752,11 @@ namespace ts {
case SyntaxKind.ParenthesizedExpression:
return evaluate((<ParenthesizedExpression>expr).expression);
case SyntaxKind.Identifier:
return nodeIsMissing(expr) ? 0 : evaluateEnumMember(expr, getSymbolOfNode(member.parent), (<Identifier>expr).escapedText);
const identifier = <Identifier>expr;
if (isInfinityOrNaNString(identifier.escapedText)) {
return +(identifier.escapedText);
}
return nodeIsMissing(expr) ? 0 : evaluateEnumMember(expr, getSymbolOfNode(member.parent), identifier.escapedText);
case SyntaxKind.ElementAccessExpression:
case SyntaxKind.PropertyAccessExpression:
const ex = <PropertyAccessExpression | ElementAccessExpression>expr;

View File

@ -0,0 +1,64 @@
tests/cases/conformance/enums/enumConstantMembers.ts(32,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
tests/cases/conformance/enums/enumConstantMembers.ts(33,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
tests/cases/conformance/enums/enumConstantMembers.ts(34,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
tests/cases/conformance/enums/enumConstantMembers.ts(35,9): error TS2478: 'const' enum member initializer was evaluated to disallowed value 'NaN'.
tests/cases/conformance/enums/enumConstantMembers.ts(36,9): error TS2478: 'const' enum member initializer was evaluated to disallowed value 'NaN'.
tests/cases/conformance/enums/enumConstantMembers.ts(37,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
tests/cases/conformance/enums/enumConstantMembers.ts(38,9): error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
==== tests/cases/conformance/enums/enumConstantMembers.ts (7 errors) ====
// Constant members allow negatives, but not decimals. Also hex literals are allowed
enum E1 {
a = 1,
b
}
enum E2 {
a = - 1,
b
}
enum E3 {
a = 0.1,
b // Error because 0.1 is not a constant
}
declare enum E4 {
a = 1,
b = -1,
c = 0.1 // Not a constant
}
enum E5 {
a = 1 / 0,
b = 2 / 0.0,
c = 1.0 / 0.0,
d = 0.0 / 0.0,
e = NaN,
f = Infinity,
g = -Infinity
}
const enum E6 {
a = 1 / 0,
~~~~~
!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
b = 2 / 0.0,
~~~~~~~
!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
c = 1.0 / 0.0,
~~~~~~~~~
!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
d = 0.0 / 0.0,
~~~~~~~~~
!!! error TS2478: 'const' enum member initializer was evaluated to disallowed value 'NaN'.
e = NaN,
~~~
!!! error TS2478: 'const' enum member initializer was evaluated to disallowed value 'NaN'.
f = Infinity,
~~~~~~~~
!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
g = -Infinity
~~~~~~~~~
!!! error TS2477: 'const' enum member initializer was evaluated to a non-finite value.
}

View File

@ -17,7 +17,28 @@ declare enum E4 {
a = 1,
b = -1,
c = 0.1 // Not a constant
}
}
enum E5 {
a = 1 / 0,
b = 2 / 0.0,
c = 1.0 / 0.0,
d = 0.0 / 0.0,
e = NaN,
f = Infinity,
g = -Infinity
}
const enum E6 {
a = 1 / 0,
b = 2 / 0.0,
c = 1.0 / 0.0,
d = 0.0 / 0.0,
e = NaN,
f = Infinity,
g = -Infinity
}
//// [enumConstantMembers.js]
// Constant members allow negatives, but not decimals. Also hex literals are allowed
@ -36,3 +57,13 @@ var E3;
E3[E3["a"] = 0.1] = "a";
E3[E3["b"] = 1.1] = "b"; // Error because 0.1 is not a constant
})(E3 || (E3 = {}));
var E5;
(function (E5) {
E5[E5["a"] = Infinity] = "a";
E5[E5["b"] = Infinity] = "b";
E5[E5["c"] = Infinity] = "c";
E5[E5["d"] = NaN] = "d";
E5[E5["e"] = NaN] = "e";
E5[E5["f"] = Infinity] = "f";
E5[E5["g"] = -Infinity] = "g";
})(E5 || (E5 = {}));

View File

@ -40,3 +40,60 @@ declare enum E4 {
c = 0.1 // Not a constant
>c : Symbol(E4.c, Decl(enumConstantMembers.ts, 16, 11))
}
enum E5 {
>E5 : Symbol(E5, Decl(enumConstantMembers.ts, 18, 1))
a = 1 / 0,
>a : Symbol(E5.a, Decl(enumConstantMembers.ts, 20, 9))
b = 2 / 0.0,
>b : Symbol(E5.b, Decl(enumConstantMembers.ts, 21, 14))
c = 1.0 / 0.0,
>c : Symbol(E5.c, Decl(enumConstantMembers.ts, 22, 16))
d = 0.0 / 0.0,
>d : Symbol(E5.d, Decl(enumConstantMembers.ts, 23, 18))
e = NaN,
>e : Symbol(E5.e, Decl(enumConstantMembers.ts, 24, 18))
>NaN : Symbol(NaN, Decl(lib.d.ts, --, --))
f = Infinity,
>f : Symbol(E5.f, Decl(enumConstantMembers.ts, 25, 12))
>Infinity : Symbol(Infinity, Decl(lib.d.ts, --, --))
g = -Infinity
>g : Symbol(E5.g, Decl(enumConstantMembers.ts, 26, 17))
>Infinity : Symbol(Infinity, Decl(lib.d.ts, --, --))
}
const enum E6 {
>E6 : Symbol(E6, Decl(enumConstantMembers.ts, 28, 1))
a = 1 / 0,
>a : Symbol(E6.a, Decl(enumConstantMembers.ts, 30, 15))
b = 2 / 0.0,
>b : Symbol(E6.b, Decl(enumConstantMembers.ts, 31, 14))
c = 1.0 / 0.0,
>c : Symbol(E6.c, Decl(enumConstantMembers.ts, 32, 16))
d = 0.0 / 0.0,
>d : Symbol(E6.d, Decl(enumConstantMembers.ts, 33, 18))
e = NaN,
>e : Symbol(E6.e, Decl(enumConstantMembers.ts, 34, 18))
>NaN : Symbol(NaN, Decl(lib.d.ts, --, --))
f = Infinity,
>f : Symbol(E6.f, Decl(enumConstantMembers.ts, 35, 12))
>Infinity : Symbol(Infinity, Decl(lib.d.ts, --, --))
g = -Infinity
>g : Symbol(E6.g, Decl(enumConstantMembers.ts, 36, 17))
>Infinity : Symbol(Infinity, Decl(lib.d.ts, --, --))
}

View File

@ -48,3 +48,86 @@ declare enum E4 {
>c : E4.c
>0.1 : 0.1
}
enum E5 {
>E5 : E5
a = 1 / 0,
>a : E5
>1 / 0 : number
>1 : 1
>0 : 0
b = 2 / 0.0,
>b : E5
>2 / 0.0 : number
>2 : 2
>0.0 : 0
c = 1.0 / 0.0,
>c : E5
>1.0 / 0.0 : number
>1.0 : 1
>0.0 : 0
d = 0.0 / 0.0,
>d : E5
>0.0 / 0.0 : number
>0.0 : 0
>0.0 : 0
e = NaN,
>e : E5
>NaN : number
f = Infinity,
>f : E5
>Infinity : number
g = -Infinity
>g : E5
>-Infinity : number
>Infinity : number
}
const enum E6 {
>E6 : E6
a = 1 / 0,
>a : E6
>1 / 0 : number
>1 : 1
>0 : 0
b = 2 / 0.0,
>b : E6
>2 / 0.0 : number
>2 : 2
>0.0 : 0
c = 1.0 / 0.0,
>c : E6
>1.0 / 0.0 : number
>1.0 : 1
>0.0 : 0
d = 0.0 / 0.0,
>d : E6
>0.0 / 0.0 : number
>0.0 : 0
>0.0 : 0
e = NaN,
>e : E6
>NaN : number
f = Infinity,
>f : E6
>Infinity : number
g = -Infinity
>g : E6
>-Infinity : number
>Infinity : number
}

View File

@ -16,4 +16,24 @@ declare enum E4 {
a = 1,
b = -1,
c = 0.1 // Not a constant
}
}
enum E5 {
a = 1 / 0,
b = 2 / 0.0,
c = 1.0 / 0.0,
d = 0.0 / 0.0,
e = NaN,
f = Infinity,
g = -Infinity
}
const enum E6 {
a = 1 / 0,
b = 2 / 0.0,
c = 1.0 / 0.0,
d = 0.0 / 0.0,
e = NaN,
f = Infinity,
g = -Infinity
}