google / google/closure-compiler
Falsy SHIFT_AMOUNT_OUT_OF_BOUNDS warning
- Dominant language
- JavaScript
- Stars
- 7.7k
- Forks
- 1.2k
- Avg merge
- 2d 12h
- Merged PRs (30d)
- 6
Description
See https://groups.google.com/forum/#!msg/closure-compiler-discuss/uwHMX9Cgy1U/2zHbGAOpCgAJ
This code:
``` js
/** @enum {number} */
var SomeEnum =
{
val37: 37,
val38: 38,
val39: 39
};
/** @const {number} */
var kLowBitsCount = 31;
/** @constructor */
var SomeClass = function()
{
/** @type {number} */
this.categoriesHolderLow_ = 0;
/** @type {number} */
this.categoriesHolderHigh_ = 0;
}
/**
* @param {!SomeEnum} category Number-based enum that has more than 32 values (34 actally)
* @return {boolean}
*/
SomeClass.prototype.checkCategory = function (category)
{
if (category >= kLowBitsCount) // kLowBitsCount is 31 so we never cross bounds
{
return !!(this.categoriesHolderHigh_ & (
1 << (category - kLowBitsCount))); // <- warnings line
}
return !!(this.categoriesHolderLow_ & (1 << category));
};
var c = new SomeClass();
alert(c.checkCategory(SomeEnum.val38));
```
does emit wrong warning at wrong place:
JSC_SHIFT_AMOUNT_OUT_OF_BOUNDS: Shift amount out of bounds: NUMBER 38.0 5 [originalname: SomeEnum.val38] [source_file: Input_0] : number at line 5 character 11
val38: 38,
^
Though shift never get out of bounds here.
https://closure-compiler.appspot.com/home#code%3D%252F%252F%2520%253D%253DClosureCompiler%253D%253D%250A%252F%252F%2520%2540compilation_level%2520ADVANCED_OPTIMIZATIONS%250A%252F%252F%2520%2540output_file_name%2520default.js%250A%252F%252F%2520%253D%253D%252FClosureCompiler%253D%253D%250A%250A%252F**%2520%2540enum%2520%257Bnumber%257D%2520*%252F%250Avar%2520SomeEnum%2520%253D%250A%257B%250A%2520%2520%2520%2520val37%253A%252037%252C%250A%2520%2520%2520%2520val38%253A%252038%252C%250A%2520%2520%2520%2520val39%253A%252039%250A%257D%253B%250A%250A%252F**%2520%2540const%2520%257Bnumber%257D%2520*%252F%250Avar%2520kLowBitsCount%2520%253D%252031%253B%250A%250A%252F**%2520%2540constructor%2520*%252F%250Avar%2520SomeClass%2520%253D%2520function()%250A%257B%250A%2520%2520%2520%2520%252F**%2520%2540type%2520%257Bnumber%257D%2520*%252F%250A%2520%2520%2520%2520this.categoriesHolderLow_%2520%253D%25200%253B%250A%250A%2520%2520%2520%2520%252F**%2520%2540type%2520%257Bnumber%257D%2520*%252F%250A%2520%2520%2520%2520this.categoriesHolderHigh_%2520%253D%25200%253B%250A%257D%250A%250A%252F**%250A%2520*%2520%2540param%2520%257B!SomeEnum%257D%2520category%2520Number-based%2520enum%2520that%2520has%2520more%2520than%252032%2520values%2520(34%2520actally)%250A%2520*%2520%2540return%2520%257Bboolean%257D%250A%2520*%252F%250ASomeClass.prototype.checkCategory%2520%253D%2520function%2520(category)%250A%257B%250A%2520%2520%2520%2520if%2520(category%2520%253E%253D%2520kLowBitsCount)%2520%2520%2520%252F%252F%2520kLowBitsCount%2520is%252031%2520so%2520we%2520never%2520cross%2520bounds%250A%2520%2520%2520%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520return%2520!!(this.categoriesHolderHigh_%2520%2526%2520(%250A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%25201%2520%253C%253C%2520(category%2520-%2520kLowBitsCount)))%253B%2520%2520%252F%252F%2520%253C-%2520warnings%2520line%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520return%2520!!(this.categoriesHolderLow_%2520%2526%2520(1%2520%253C%253C%2520category))%253B%250A%257D%253B%250A%250Avar%2520c%2520%253D%2520new%2520SomeClass()%253B%250Aalert(c.checkCategory(SomeEnum.val38))%253B%250A
Contributor guide
Assessment
This issue has not been assessed yet.