Suggest simplifications for overzealous shifts (#59519)

This commit is contained in:
Wesley Wigham 2024-08-14 13:07:50 -07:00 коммит произвёл GitHub
Родитель 25e09d9fc3
Коммит 1250b480a5
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
9 изменённых файлов: 1464 добавлений и 4 удалений

Просмотреть файл

@ -39831,6 +39831,28 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
if (leftOk && rightOk) {
checkAssignmentOperator(resultType);
switch (operator) {
case SyntaxKind.LessThanLessThanToken:
case SyntaxKind.LessThanLessThanEqualsToken:
case SyntaxKind.GreaterThanGreaterThanToken:
case SyntaxKind.GreaterThanGreaterThanEqualsToken:
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:
const rhsEval = evaluate(right);
if (typeof rhsEval.value === "number" && Math.abs(rhsEval.value) >= 32) {
errorOrSuggestion(
isEnumMember(walkUpParenthesizedExpressions(right.parent.parent)), // elevate from suggestion to error within an enum member
errorNode || operatorToken,
Diagnostics.This_operation_can_be_simplified_This_shift_is_identical_to_0_1_2,
getTextOfNode(left),
tokenToString(operator),
rhsEval.value % 32,
);
}
break;
default:
break;
}
}
return resultType;
}

Просмотреть файл

@ -6420,6 +6420,10 @@
"category": "Message",
"code": 6806
},
"This operation can be simplified. This shift is identical to `{0} {1} {2}`.": {
"category": "Error",
"code": 6807
},
"one of:": {
"category": "Message",

Просмотреть файл

@ -241,7 +241,7 @@ export class CompilationResult {
}
}
export function compileFiles(host: fakes.CompilerHost, rootFiles: string[] | undefined, compilerOptions: ts.CompilerOptions, typeScriptVersion?: string): CompilationResult {
export function compileFiles(host: fakes.CompilerHost, rootFiles: string[] | undefined, compilerOptions: ts.CompilerOptions, typeScriptVersion?: string, captureSuggestions?: boolean): CompilationResult {
if (compilerOptions.project || !rootFiles || rootFiles.length === 0) {
const project = readProject(host.parseConfigHost, compilerOptions.project, compilerOptions);
if (project) {
@ -265,11 +265,17 @@ export function compileFiles(host: fakes.CompilerHost, rootFiles: string[] | und
// and if the test is running `skipLibCheck` - an indicator that we want the tets to run quickly - skip the before/after error comparison, too
const skipErrorComparison = ts.length(rootFiles) >= 100 || (!!compilerOptions.skipLibCheck && !!compilerOptions.declaration);
const preProgram = !skipErrorComparison ? ts.createProgram({ rootNames: rootFiles || [], options: { ...compilerOptions, configFile: compilerOptions.configFile, traceResolution: false }, host, typeScriptVersion }) : undefined;
const preErrors = preProgram && ts.getPreEmitDiagnostics(preProgram);
let preErrors = preProgram && ts.getPreEmitDiagnostics(preProgram);
if (preProgram && captureSuggestions) {
preErrors = ts.concatenate(preErrors, ts.flatMap(preProgram.getSourceFiles(), f => preProgram.getSuggestionDiagnostics(f)));
}
const program = ts.createProgram({ rootNames: rootFiles || [], options: compilerOptions, host, typeScriptVersion });
const emitResult = program.emit();
const postErrors = ts.getPreEmitDiagnostics(program);
let postErrors = ts.getPreEmitDiagnostics(program);
if (captureSuggestions) {
postErrors = ts.concatenate(postErrors, ts.flatMap(program.getSourceFiles(), f => program.getSuggestionDiagnostics(f)));
}
const longerErrors = ts.length(preErrors) > postErrors.length ? preErrors : postErrors;
const shorterErrors = longerErrors === preErrors ? postErrors : preErrors;
const errors = preErrors && (preErrors.length !== postErrors.length) ? [

Просмотреть файл

@ -282,6 +282,7 @@ export namespace Compiler {
baselineFile?: string;
libFiles?: string;
noTypesAndSymbols?: boolean;
captureSuggestions?: boolean;
}
// Additional options not already in ts.optionDeclarations
@ -303,6 +304,7 @@ export namespace Compiler {
{ name: "fullEmitPaths", type: "boolean", defaultValueDescription: false },
{ name: "noCheck", type: "boolean", defaultValueDescription: false },
{ name: "reportDiagnostics", type: "boolean", defaultValueDescription: false }, // used to enable error collection in `transpile` baselines
{ name: "captureSuggestions", type: "boolean", defaultValueDescription: false }, // Adds suggestion diagnostics to error baselines
];
let optionsIndex: Map<string, ts.CommandLineOption>;
@ -428,7 +430,7 @@ export namespace Compiler {
ts.assign(options, ts.convertToOptionsWithAbsolutePaths(options, path => ts.getNormalizedAbsolutePath(path, currentDirectory)));
const host = new fakes.CompilerHost(fs, options);
const result = compiler.compileFiles(host, programFileNames, options, typeScriptVersion);
const result = compiler.compileFiles(host, programFileNames, options, typeScriptVersion, harnessSettings?.captureSuggestions === "true");
result.symlinks = symlinks;
(result as CompileFilesResult).repeat = newOptions => compileFiles(inputFiles, otherFiles, { ...harnessSettings, ...newOptions }, compilerOptions, originalCurrentDirectory, symlinks);
return result as CompileFilesResult;

Просмотреть файл

@ -0,0 +1,253 @@
overshifts.ts(2,1): suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(3,1): suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 27`.
overshifts.ts(4,1): suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(6,1): suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(7,1): suggestion TS6807: This operation can be simplified. This shift is identical to `1 << -27`.
overshifts.ts(8,1): suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(11,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(12,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 27`.
overshifts.ts(13,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(15,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(16,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> -27`.
overshifts.ts(17,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(20,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(21,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 27`.
overshifts.ts(22,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(24,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(25,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> -27`.
overshifts.ts(26,1): suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(30,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
overshifts.ts(31,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 27`.
overshifts.ts(32,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
overshifts.ts(34,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
overshifts.ts(35,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= -27`.
overshifts.ts(36,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
overshifts.ts(39,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
overshifts.ts(40,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 27`.
overshifts.ts(41,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
overshifts.ts(43,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
overshifts.ts(44,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= -27`.
overshifts.ts(45,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
overshifts.ts(48,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
overshifts.ts(49,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 27`.
overshifts.ts(50,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
overshifts.ts(52,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
overshifts.ts(53,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= -27`.
overshifts.ts(54,1): suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
overshifts.ts(58,9): error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(59,9): error TS6807: This operation can be simplified. This shift is identical to `1 << 27`.
overshifts.ts(60,9): error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(62,9): error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(63,9): error TS6807: This operation can be simplified. This shift is identical to `1 << -27`.
overshifts.ts(64,9): error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
overshifts.ts(69,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(70,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 27`.
overshifts.ts(71,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(73,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(74,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> -27`.
overshifts.ts(75,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
overshifts.ts(80,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(81,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 27`.
overshifts.ts(82,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(84,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
overshifts.ts(85,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> -27`.
overshifts.ts(86,9): error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
==== overshifts.ts (54 errors) ====
1 << 1; // ok
1 << 32; // overshift
~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
1 << 123;
~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 27`.
1 << 1024;
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
1 << -1; // OK-ish
1 << -32; // backwards overshift
~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
1 << -123;
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `1 << -27`.
1 << -1024;
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
0xFF_FF_FF_FF >> 1; // ok
0xFF_FF_FF_FF >> 32; // overshift
~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
0xFF_FF_FF_FF >> 123;
~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 27`.
0xFF_FF_FF_FF >> 1024;
~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
0xFF_FF_FF_FF >> -1; // OK-ish
0xFF_FF_FF_FF >> -32; // backwards overshift
~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
0xFF_FF_FF_FF >> -123;
~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> -27`.
0xFF_FF_FF_FF >> -1024;
~~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
0xFF_FF_FF_FF >>> 1; // ok
0xFF_FF_FF_FF >>> 32; // overshift
~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
0xFF_FF_FF_FF >>> 123;
~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 27`.
0xFF_FF_FF_FF >>> 1024;
~~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
0xFF_FF_FF_FF >>> -1; // OK-ish
0xFF_FF_FF_FF >>> -32; // backwards overshift
~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
0xFF_FF_FF_FF >>> -123;
~~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> -27`.
0xFF_FF_FF_FF >>> -1024;
~~~~~~~~~~~~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
let x = 1;
x <<= 1; // ok
x <<= 32; // overshift
~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
x <<= 123;
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 27`.
x <<= 1024;
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
x <<= -1; // OK-ish
x <<= -32; // backwards overshift
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
x <<= -123;
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= -27`.
x <<= -1024;
~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x <<= 0`.
x >>= 1; // ok
x >>= 32; // overshift
~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
x >>= 123;
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 27`.
x >>= 1024;
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
x >>= -1; // OK-ish
x >>= -32; // backwards overshift
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
x >>= -123;
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= -27`.
x >>= -1024;
~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>= 0`.
x >>>= 1; // ok
x >>>= 32; // overshift
~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
x >>>= 123;
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 27`.
x >>>= 1024;
~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
x >>>= -1; // OK-ish
x >>>= -32; // backwards overshift
~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
x >>>= -123;
~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= -27`.
x >>>= -1024;
~~~~~~~~~~~~
!!! suggestion TS6807: This operation can be simplified. This shift is identical to `x >>>= 0`.
enum One {
A = 1 << 1, // ok
B = 1 << 32, // overshift
~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
C = 1 << 123,
~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `1 << 27`.
D = 1 << 1024,
~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
E = 1 << -1, // OK-ish
F = 1 << -32, // backwards overshift
~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
G = 1 << -123,
~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `1 << -27`.
H = 1 << -1024,
~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `1 << 0`.
}
enum Two {
A = 0xFF_FF_FF_FF >> 1, // ok
B = 0xFF_FF_FF_FF >> 32, // overshift
~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
C = 0xFF_FF_FF_FF >> 123,
~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 27`.
D = 0xFF_FF_FF_FF >> 1024,
~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
E = 0xFF_FF_FF_FF >> -1, // OK-ish
F = 0xFF_FF_FF_FF >> -32, // backwards overshift
~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
G = 0xFF_FF_FF_FF >> -123,
~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> -27`.
H = 0xFF_FF_FF_FF >> -1024,
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >> 0`.
}
enum Three {
A = 0xFF_FF_FF_FF >>> 1, // ok
B = 0xFF_FF_FF_FF >>> 32, // overshift
~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
C = 0xFF_FF_FF_FF >>> 123,
~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 27`.
D = 0xFF_FF_FF_FF >>> 1024,
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
E = 0xFF_FF_FF_FF >>> -1, // OK-ish
F = 0xFF_FF_FF_FF >>> -32, // backwards overshift
~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
G = 0xFF_FF_FF_FF >>> -123,
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> -27`.
H = 0xFF_FF_FF_FF >>> -1024,
~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS6807: This operation can be simplified. This shift is identical to `0xFF_FF_FF_FF >>> 0`.
}

Просмотреть файл

@ -0,0 +1,175 @@
//// [tests/cases/compiler/overshifts.ts] ////
//// [overshifts.ts]
1 << 1; // ok
1 << 32; // overshift
1 << 123;
1 << 1024;
1 << -1; // OK-ish
1 << -32; // backwards overshift
1 << -123;
1 << -1024;
0xFF_FF_FF_FF >> 1; // ok
0xFF_FF_FF_FF >> 32; // overshift
0xFF_FF_FF_FF >> 123;
0xFF_FF_FF_FF >> 1024;
0xFF_FF_FF_FF >> -1; // OK-ish
0xFF_FF_FF_FF >> -32; // backwards overshift
0xFF_FF_FF_FF >> -123;
0xFF_FF_FF_FF >> -1024;
0xFF_FF_FF_FF >>> 1; // ok
0xFF_FF_FF_FF >>> 32; // overshift
0xFF_FF_FF_FF >>> 123;
0xFF_FF_FF_FF >>> 1024;
0xFF_FF_FF_FF >>> -1; // OK-ish
0xFF_FF_FF_FF >>> -32; // backwards overshift
0xFF_FF_FF_FF >>> -123;
0xFF_FF_FF_FF >>> -1024;
let x = 1;
x <<= 1; // ok
x <<= 32; // overshift
x <<= 123;
x <<= 1024;
x <<= -1; // OK-ish
x <<= -32; // backwards overshift
x <<= -123;
x <<= -1024;
x >>= 1; // ok
x >>= 32; // overshift
x >>= 123;
x >>= 1024;
x >>= -1; // OK-ish
x >>= -32; // backwards overshift
x >>= -123;
x >>= -1024;
x >>>= 1; // ok
x >>>= 32; // overshift
x >>>= 123;
x >>>= 1024;
x >>>= -1; // OK-ish
x >>>= -32; // backwards overshift
x >>>= -123;
x >>>= -1024;
enum One {
A = 1 << 1, // ok
B = 1 << 32, // overshift
C = 1 << 123,
D = 1 << 1024,
E = 1 << -1, // OK-ish
F = 1 << -32, // backwards overshift
G = 1 << -123,
H = 1 << -1024,
}
enum Two {
A = 0xFF_FF_FF_FF >> 1, // ok
B = 0xFF_FF_FF_FF >> 32, // overshift
C = 0xFF_FF_FF_FF >> 123,
D = 0xFF_FF_FF_FF >> 1024,
E = 0xFF_FF_FF_FF >> -1, // OK-ish
F = 0xFF_FF_FF_FF >> -32, // backwards overshift
G = 0xFF_FF_FF_FF >> -123,
H = 0xFF_FF_FF_FF >> -1024,
}
enum Three {
A = 0xFF_FF_FF_FF >>> 1, // ok
B = 0xFF_FF_FF_FF >>> 32, // overshift
C = 0xFF_FF_FF_FF >>> 123,
D = 0xFF_FF_FF_FF >>> 1024,
E = 0xFF_FF_FF_FF >>> -1, // OK-ish
F = 0xFF_FF_FF_FF >>> -32, // backwards overshift
G = 0xFF_FF_FF_FF >>> -123,
H = 0xFF_FF_FF_FF >>> -1024,
}
//// [overshifts.js]
1 << 1; // ok
1 << 32; // overshift
1 << 123;
1 << 1024;
1 << -1; // OK-ish
1 << -32; // backwards overshift
1 << -123;
1 << -1024;
4294967295 >> 1; // ok
4294967295 >> 32; // overshift
4294967295 >> 123;
4294967295 >> 1024;
4294967295 >> -1; // OK-ish
4294967295 >> -32; // backwards overshift
4294967295 >> -123;
4294967295 >> -1024;
4294967295 >>> 1; // ok
4294967295 >>> 32; // overshift
4294967295 >>> 123;
4294967295 >>> 1024;
4294967295 >>> -1; // OK-ish
4294967295 >>> -32; // backwards overshift
4294967295 >>> -123;
4294967295 >>> -1024;
var x = 1;
x <<= 1; // ok
x <<= 32; // overshift
x <<= 123;
x <<= 1024;
x <<= -1; // OK-ish
x <<= -32; // backwards overshift
x <<= -123;
x <<= -1024;
x >>= 1; // ok
x >>= 32; // overshift
x >>= 123;
x >>= 1024;
x >>= -1; // OK-ish
x >>= -32; // backwards overshift
x >>= -123;
x >>= -1024;
x >>>= 1; // ok
x >>>= 32; // overshift
x >>>= 123;
x >>>= 1024;
x >>>= -1; // OK-ish
x >>>= -32; // backwards overshift
x >>>= -123;
x >>>= -1024;
var One;
(function (One) {
One[One["A"] = 2] = "A";
One[One["B"] = 1] = "B";
One[One["C"] = 134217728] = "C";
One[One["D"] = 1] = "D";
One[One["E"] = -2147483648] = "E";
One[One["F"] = 1] = "F";
One[One["G"] = 32] = "G";
One[One["H"] = 1] = "H";
})(One || (One = {}));
var Two;
(function (Two) {
Two[Two["A"] = -1] = "A";
Two[Two["B"] = -1] = "B";
Two[Two["C"] = -1] = "C";
Two[Two["D"] = -1] = "D";
Two[Two["E"] = -1] = "E";
Two[Two["F"] = -1] = "F";
Two[Two["G"] = -1] = "G";
Two[Two["H"] = -1] = "H";
})(Two || (Two = {}));
var Three;
(function (Three) {
Three[Three["A"] = 2147483647] = "A";
Three[Three["B"] = 4294967295] = "B";
Three[Three["C"] = 31] = "C";
Three[Three["D"] = 4294967295] = "D";
Three[Three["E"] = 1] = "E";
Three[Three["F"] = 4294967295] = "F";
Three[Three["G"] = 134217727] = "G";
Three[Three["H"] = 4294967295] = "H";
})(Three || (Three = {}));

Просмотреть файл

@ -0,0 +1,189 @@
//// [tests/cases/compiler/overshifts.ts] ////
=== overshifts.ts ===
1 << 1; // ok
1 << 32; // overshift
1 << 123;
1 << 1024;
1 << -1; // OK-ish
1 << -32; // backwards overshift
1 << -123;
1 << -1024;
0xFF_FF_FF_FF >> 1; // ok
0xFF_FF_FF_FF >> 32; // overshift
0xFF_FF_FF_FF >> 123;
0xFF_FF_FF_FF >> 1024;
0xFF_FF_FF_FF >> -1; // OK-ish
0xFF_FF_FF_FF >> -32; // backwards overshift
0xFF_FF_FF_FF >> -123;
0xFF_FF_FF_FF >> -1024;
0xFF_FF_FF_FF >>> 1; // ok
0xFF_FF_FF_FF >>> 32; // overshift
0xFF_FF_FF_FF >>> 123;
0xFF_FF_FF_FF >>> 1024;
0xFF_FF_FF_FF >>> -1; // OK-ish
0xFF_FF_FF_FF >>> -32; // backwards overshift
0xFF_FF_FF_FF >>> -123;
0xFF_FF_FF_FF >>> -1024;
let x = 1;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= 1; // ok
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= 32; // overshift
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= 123;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= 1024;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= -1; // OK-ish
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= -32; // backwards overshift
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= -123;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x <<= -1024;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= 1; // ok
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= 32; // overshift
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= 123;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= 1024;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= -1; // OK-ish
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= -32; // backwards overshift
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= -123;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>= -1024;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= 1; // ok
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= 32; // overshift
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= 123;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= 1024;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= -1; // OK-ish
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= -32; // backwards overshift
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= -123;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
x >>>= -1024;
>x : Symbol(x, Decl(overshifts.ts, 27, 3))
enum One {
>One : Symbol(One, Decl(overshifts.ts, 53, 13))
A = 1 << 1, // ok
>A : Symbol(One.A, Decl(overshifts.ts, 55, 10))
B = 1 << 32, // overshift
>B : Symbol(One.B, Decl(overshifts.ts, 56, 15))
C = 1 << 123,
>C : Symbol(One.C, Decl(overshifts.ts, 57, 16))
D = 1 << 1024,
>D : Symbol(One.D, Decl(overshifts.ts, 58, 17))
E = 1 << -1, // OK-ish
>E : Symbol(One.E, Decl(overshifts.ts, 59, 18))
F = 1 << -32, // backwards overshift
>F : Symbol(One.F, Decl(overshifts.ts, 60, 16))
G = 1 << -123,
>G : Symbol(One.G, Decl(overshifts.ts, 61, 17))
H = 1 << -1024,
>H : Symbol(One.H, Decl(overshifts.ts, 62, 18))
}
enum Two {
>Two : Symbol(Two, Decl(overshifts.ts, 64, 1))
A = 0xFF_FF_FF_FF >> 1, // ok
>A : Symbol(Two.A, Decl(overshifts.ts, 66, 10))
B = 0xFF_FF_FF_FF >> 32, // overshift
>B : Symbol(Two.B, Decl(overshifts.ts, 67, 27))
C = 0xFF_FF_FF_FF >> 123,
>C : Symbol(Two.C, Decl(overshifts.ts, 68, 28))
D = 0xFF_FF_FF_FF >> 1024,
>D : Symbol(Two.D, Decl(overshifts.ts, 69, 29))
E = 0xFF_FF_FF_FF >> -1, // OK-ish
>E : Symbol(Two.E, Decl(overshifts.ts, 70, 30))
F = 0xFF_FF_FF_FF >> -32, // backwards overshift
>F : Symbol(Two.F, Decl(overshifts.ts, 71, 28))
G = 0xFF_FF_FF_FF >> -123,
>G : Symbol(Two.G, Decl(overshifts.ts, 72, 29))
H = 0xFF_FF_FF_FF >> -1024,
>H : Symbol(Two.H, Decl(overshifts.ts, 73, 30))
}
enum Three {
>Three : Symbol(Three, Decl(overshifts.ts, 75, 1))
A = 0xFF_FF_FF_FF >>> 1, // ok
>A : Symbol(Three.A, Decl(overshifts.ts, 77, 12))
B = 0xFF_FF_FF_FF >>> 32, // overshift
>B : Symbol(Three.B, Decl(overshifts.ts, 78, 28))
C = 0xFF_FF_FF_FF >>> 123,
>C : Symbol(Three.C, Decl(overshifts.ts, 79, 29))
D = 0xFF_FF_FF_FF >>> 1024,
>D : Symbol(Three.D, Decl(overshifts.ts, 80, 30))
E = 0xFF_FF_FF_FF >>> -1, // OK-ish
>E : Symbol(Three.E, Decl(overshifts.ts, 81, 31))
F = 0xFF_FF_FF_FF >>> -32, // backwards overshift
>F : Symbol(Three.F, Decl(overshifts.ts, 82, 29))
G = 0xFF_FF_FF_FF >>> -123,
>G : Symbol(Three.G, Decl(overshifts.ts, 83, 30))
H = 0xFF_FF_FF_FF >>> -1024,
>H : Symbol(Three.H, Decl(overshifts.ts, 84, 31))
}

Просмотреть файл

@ -0,0 +1,720 @@
//// [tests/cases/compiler/overshifts.ts] ////
=== overshifts.ts ===
1 << 1; // ok
>1 << 1 : number
> : ^^^^^^
>1 : 1
> : ^
>1 : 1
> : ^
1 << 32; // overshift
>1 << 32 : number
> : ^^^^^^
>1 : 1
> : ^
>32 : 32
> : ^^
1 << 123;
>1 << 123 : number
> : ^^^^^^
>1 : 1
> : ^
>123 : 123
> : ^^^
1 << 1024;
>1 << 1024 : number
> : ^^^^^^
>1 : 1
> : ^
>1024 : 1024
> : ^^^^
1 << -1; // OK-ish
>1 << -1 : number
> : ^^^^^^
>1 : 1
> : ^
>-1 : -1
> : ^^
>1 : 1
> : ^
1 << -32; // backwards overshift
>1 << -32 : number
> : ^^^^^^
>1 : 1
> : ^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
1 << -123;
>1 << -123 : number
> : ^^^^^^
>1 : 1
> : ^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
1 << -1024;
>1 << -1024 : number
> : ^^^^^^
>1 : 1
> : ^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
0xFF_FF_FF_FF >> 1; // ok
>0xFF_FF_FF_FF >> 1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1 : 1
> : ^
0xFF_FF_FF_FF >> 32; // overshift
>0xFF_FF_FF_FF >> 32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>32 : 32
> : ^^
0xFF_FF_FF_FF >> 123;
>0xFF_FF_FF_FF >> 123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>123 : 123
> : ^^^
0xFF_FF_FF_FF >> 1024;
>0xFF_FF_FF_FF >> 1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1024 : 1024
> : ^^^^
0xFF_FF_FF_FF >> -1; // OK-ish
>0xFF_FF_FF_FF >> -1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
0xFF_FF_FF_FF >> -32; // backwards overshift
>0xFF_FF_FF_FF >> -32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
0xFF_FF_FF_FF >> -123;
>0xFF_FF_FF_FF >> -123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
0xFF_FF_FF_FF >> -1024;
>0xFF_FF_FF_FF >> -1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
0xFF_FF_FF_FF >>> 1; // ok
>0xFF_FF_FF_FF >>> 1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1 : 1
> : ^
0xFF_FF_FF_FF >>> 32; // overshift
>0xFF_FF_FF_FF >>> 32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>32 : 32
> : ^^
0xFF_FF_FF_FF >>> 123;
>0xFF_FF_FF_FF >>> 123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>123 : 123
> : ^^^
0xFF_FF_FF_FF >>> 1024;
>0xFF_FF_FF_FF >>> 1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1024 : 1024
> : ^^^^
0xFF_FF_FF_FF >>> -1; // OK-ish
>0xFF_FF_FF_FF >>> -1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
0xFF_FF_FF_FF >>> -32; // backwards overshift
>0xFF_FF_FF_FF >>> -32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
0xFF_FF_FF_FF >>> -123;
>0xFF_FF_FF_FF >>> -123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
0xFF_FF_FF_FF >>> -1024;
>0xFF_FF_FF_FF >>> -1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
let x = 1;
>x : number
> : ^^^^^^
>1 : 1
> : ^
x <<= 1; // ok
>x <<= 1 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>1 : 1
> : ^
x <<= 32; // overshift
>x <<= 32 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>32 : 32
> : ^^
x <<= 123;
>x <<= 123 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>123 : 123
> : ^^^
x <<= 1024;
>x <<= 1024 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>1024 : 1024
> : ^^^^
x <<= -1; // OK-ish
>x <<= -1 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
x <<= -32; // backwards overshift
>x <<= -32 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
x <<= -123;
>x <<= -123 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
x <<= -1024;
>x <<= -1024 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
x >>= 1; // ok
>x >>= 1 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>1 : 1
> : ^
x >>= 32; // overshift
>x >>= 32 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>32 : 32
> : ^^
x >>= 123;
>x >>= 123 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>123 : 123
> : ^^^
x >>= 1024;
>x >>= 1024 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>1024 : 1024
> : ^^^^
x >>= -1; // OK-ish
>x >>= -1 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
x >>= -32; // backwards overshift
>x >>= -32 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
x >>= -123;
>x >>= -123 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
x >>= -1024;
>x >>= -1024 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
x >>>= 1; // ok
>x >>>= 1 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>1 : 1
> : ^
x >>>= 32; // overshift
>x >>>= 32 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>32 : 32
> : ^^
x >>>= 123;
>x >>>= 123 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>123 : 123
> : ^^^
x >>>= 1024;
>x >>>= 1024 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>1024 : 1024
> : ^^^^
x >>>= -1; // OK-ish
>x >>>= -1 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
x >>>= -32; // backwards overshift
>x >>>= -32 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
x >>>= -123;
>x >>>= -123 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
x >>>= -1024;
>x >>>= -1024 : number
> : ^^^^^^
>x : number
> : ^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
enum One {
>One : One
> : ^^^
A = 1 << 1, // ok
>A : One.A
> : ^^^^^
>1 << 1 : number
> : ^^^^^^
>1 : 1
> : ^
>1 : 1
> : ^
B = 1 << 32, // overshift
>B : One.B
> : ^^^^^
>1 << 32 : number
> : ^^^^^^
>1 : 1
> : ^
>32 : 32
> : ^^
C = 1 << 123,
>C : One.C
> : ^^^^^
>1 << 123 : number
> : ^^^^^^
>1 : 1
> : ^
>123 : 123
> : ^^^
D = 1 << 1024,
>D : One.B
> : ^^^^^
>1 << 1024 : number
> : ^^^^^^
>1 : 1
> : ^
>1024 : 1024
> : ^^^^
E = 1 << -1, // OK-ish
>E : One.E
> : ^^^^^
>1 << -1 : number
> : ^^^^^^
>1 : 1
> : ^
>-1 : -1
> : ^^
>1 : 1
> : ^
F = 1 << -32, // backwards overshift
>F : One.B
> : ^^^^^
>1 << -32 : number
> : ^^^^^^
>1 : 1
> : ^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
G = 1 << -123,
>G : One.G
> : ^^^^^
>1 << -123 : number
> : ^^^^^^
>1 : 1
> : ^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
H = 1 << -1024,
>H : One.B
> : ^^^^^
>1 << -1024 : number
> : ^^^^^^
>1 : 1
> : ^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
}
enum Two {
>Two : Two
> : ^^^
A = 0xFF_FF_FF_FF >> 1, // ok
>A : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> 1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1 : 1
> : ^
B = 0xFF_FF_FF_FF >> 32, // overshift
>B : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> 32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>32 : 32
> : ^^
C = 0xFF_FF_FF_FF >> 123,
>C : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> 123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>123 : 123
> : ^^^
D = 0xFF_FF_FF_FF >> 1024,
>D : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> 1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1024 : 1024
> : ^^^^
E = 0xFF_FF_FF_FF >> -1, // OK-ish
>E : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> -1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
F = 0xFF_FF_FF_FF >> -32, // backwards overshift
>F : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> -32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
G = 0xFF_FF_FF_FF >> -123,
>G : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> -123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
H = 0xFF_FF_FF_FF >> -1024,
>H : Two.A
> : ^^^^^
>0xFF_FF_FF_FF >> -1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
}
enum Three {
>Three : Three
> : ^^^^^
A = 0xFF_FF_FF_FF >>> 1, // ok
>A : Three.A
> : ^^^^^^^
>0xFF_FF_FF_FF >>> 1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1 : 1
> : ^
B = 0xFF_FF_FF_FF >>> 32, // overshift
>B : Three.B
> : ^^^^^^^
>0xFF_FF_FF_FF >>> 32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>32 : 32
> : ^^
C = 0xFF_FF_FF_FF >>> 123,
>C : Three.C
> : ^^^^^^^
>0xFF_FF_FF_FF >>> 123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>123 : 123
> : ^^^
D = 0xFF_FF_FF_FF >>> 1024,
>D : Three.B
> : ^^^^^^^
>0xFF_FF_FF_FF >>> 1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>1024 : 1024
> : ^^^^
E = 0xFF_FF_FF_FF >>> -1, // OK-ish
>E : Three.E
> : ^^^^^^^
>0xFF_FF_FF_FF >>> -1 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1 : -1
> : ^^
>1 : 1
> : ^
F = 0xFF_FF_FF_FF >>> -32, // backwards overshift
>F : Three.B
> : ^^^^^^^
>0xFF_FF_FF_FF >>> -32 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-32 : -32
> : ^^^
>32 : 32
> : ^^
G = 0xFF_FF_FF_FF >>> -123,
>G : Three.G
> : ^^^^^^^
>0xFF_FF_FF_FF >>> -123 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-123 : -123
> : ^^^^
>123 : 123
> : ^^^
H = 0xFF_FF_FF_FF >>> -1024,
>H : Three.B
> : ^^^^^^^
>0xFF_FF_FF_FF >>> -1024 : number
> : ^^^^^^
>0xFF_FF_FF_FF : 4294967295
> : ^^^^^^^^^^
>-1024 : -1024
> : ^^^^^
>1024 : 1024
> : ^^^^
}

Просмотреть файл

@ -0,0 +1,89 @@
// @captureSuggestions: true
1 << 1; // ok
1 << 32; // overshift
1 << 123;
1 << 1024;
1 << -1; // OK-ish
1 << -32; // backwards overshift
1 << -123;
1 << -1024;
0xFF_FF_FF_FF >> 1; // ok
0xFF_FF_FF_FF >> 32; // overshift
0xFF_FF_FF_FF >> 123;
0xFF_FF_FF_FF >> 1024;
0xFF_FF_FF_FF >> -1; // OK-ish
0xFF_FF_FF_FF >> -32; // backwards overshift
0xFF_FF_FF_FF >> -123;
0xFF_FF_FF_FF >> -1024;
0xFF_FF_FF_FF >>> 1; // ok
0xFF_FF_FF_FF >>> 32; // overshift
0xFF_FF_FF_FF >>> 123;
0xFF_FF_FF_FF >>> 1024;
0xFF_FF_FF_FF >>> -1; // OK-ish
0xFF_FF_FF_FF >>> -32; // backwards overshift
0xFF_FF_FF_FF >>> -123;
0xFF_FF_FF_FF >>> -1024;
let x = 1;
x <<= 1; // ok
x <<= 32; // overshift
x <<= 123;
x <<= 1024;
x <<= -1; // OK-ish
x <<= -32; // backwards overshift
x <<= -123;
x <<= -1024;
x >>= 1; // ok
x >>= 32; // overshift
x >>= 123;
x >>= 1024;
x >>= -1; // OK-ish
x >>= -32; // backwards overshift
x >>= -123;
x >>= -1024;
x >>>= 1; // ok
x >>>= 32; // overshift
x >>>= 123;
x >>>= 1024;
x >>>= -1; // OK-ish
x >>>= -32; // backwards overshift
x >>>= -123;
x >>>= -1024;
enum One {
A = 1 << 1, // ok
B = 1 << 32, // overshift
C = 1 << 123,
D = 1 << 1024,
E = 1 << -1, // OK-ish
F = 1 << -32, // backwards overshift
G = 1 << -123,
H = 1 << -1024,
}
enum Two {
A = 0xFF_FF_FF_FF >> 1, // ok
B = 0xFF_FF_FF_FF >> 32, // overshift
C = 0xFF_FF_FF_FF >> 123,
D = 0xFF_FF_FF_FF >> 1024,
E = 0xFF_FF_FF_FF >> -1, // OK-ish
F = 0xFF_FF_FF_FF >> -32, // backwards overshift
G = 0xFF_FF_FF_FF >> -123,
H = 0xFF_FF_FF_FF >> -1024,
}
enum Three {
A = 0xFF_FF_FF_FF >>> 1, // ok
B = 0xFF_FF_FF_FF >>> 32, // overshift
C = 0xFF_FF_FF_FF >>> 123,
D = 0xFF_FF_FF_FF >>> 1024,
E = 0xFF_FF_FF_FF >>> -1, // OK-ish
F = 0xFF_FF_FF_FF >>> -32, // backwards overshift
G = 0xFF_FF_FF_FF >>> -123,
H = 0xFF_FF_FF_FF >>> -1024,
}