@allenwb

> Regarding the message, "eval" and "arguments" shouldn't be called "reserved words" as they don't actually belong to that lexical category.

Agreed. (The "(a reserved word)" error messages happen even without this patch, btw.) JSHint's reserved word and var handling for strict and non-strict modes definitely needs some tweaking in this regard.

I'm thinking (optimistically) that it might just need a few simple changes localized to the `reservevar` and `W024` areas.

> You might call them "restricted identifiers" but the best linting message for this case is probably "A class defined in strict mode cannot be named 'eval' (or 'arguments')".

More specific error messages would definitely be nice, in general. Currently JSHint has the same generic error message for `var`, `let`, function params, and so on. Passing in an optional `context` argument to `identifier()` would probably work with minimal source changes.

Of course, there's only one way to be sure just how messy this solution ultimately turns out to be.

----

How about `extends`? Here is my current understanding:

```js
"use strict";
// I'm thinking this is legal, if strange, but just to make sure.
var A = class extends eval {};
// syntax error
var B = class extends public {};
```

----

I just realized that `extends` takes an `AssignmentExpression`, not a `BindingIdentifier`. Now that's prototype-based languages for you. I'll fix this first.

----

@rwldrn I know intellectually that the spec does change, and that there are people behind each change, but this is the first time I've seen it happen right before me. Very neat.