In D148197, we have made defvar statement able to refer to class
template arguments. However, the priority of class/multiclass
template argument is higher than variables defined by defvar, which
is a little counterintuitive.
In this patch, we unify the priority of variables. Each pair of
braces introduces a new scope, which may contain some additional
variables like template arguments, loop iterators, etc. We can
define local variables inside this scope via defvar and these
variables are of higher priority than additional variables. This
means that defvar will shadow additional variables with the same
name. The scope can be nested, and we use the innermost variable.
This make variables defined by defvar prior to class/multiclass
template arguments, loop iterators, etc. The shadow rules now are:
- V in a record body shadows a global V.
- V in a record body shadows template argument V.
- V in template arguments shadows a global V.
- V in a foreach statement list shadows any V in surrounding record or global scopes.
Can we make the checks more granular? While the failure here will catch the problem, it will be hard to tell which part, exactly got broken.
Having an individual test for each of the shadowing scenarious would be useful, IMO.