Types: Fix #1290: Rationalize and correct "mixed" style array dimensioning.
There a couple functional problems, which when reduced down also led to some good simplifications and rationalization. So, this commit: - corrects "mixed" functionality: int[A] f[B] -> f[B][A] - correct multi-identifier decls: int[A] f[B], g[C] -> f and g are independently sized. - increases symmetry between different places in the code that do this - makes fewer ways to do the same thing; several methods are just gone now - makes more clear when something is copied or shared
This commit is contained in:
parent
1c3ab274b1
commit
859b0342b8
17 changed files with 1323 additions and 1289 deletions
|
|
@ -934,13 +934,15 @@ parameter_declarator
|
|||
parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
|
||||
parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
|
||||
}
|
||||
parseContext.arrayDimCheck($2.loc, $1.arraySizes, $3.arraySizes);
|
||||
TType* type = new TType($1);
|
||||
type->transferArraySizes($3.arraySizes);
|
||||
type->copyArrayInnerSizes($1.arraySizes);
|
||||
|
||||
parseContext.arrayOfArrayVersionCheck($2.loc, type->getArraySizes());
|
||||
parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes);
|
||||
parseContext.reservedErrorCheck($2.loc, *$2.string);
|
||||
|
||||
TParameter param = { $2.string, new TType($1)};
|
||||
parseContext.arrayDimMerge(*param.type, $3.arraySizes);
|
||||
TParameter param = { $2.string, type };
|
||||
|
||||
$$.loc = $2.loc;
|
||||
$$.param = param;
|
||||
|
|
@ -1075,7 +1077,7 @@ fully_specified_type
|
|||
}
|
||||
|
||||
if ($2.arraySizes && parseContext.arrayQualifierError($2.loc, $1.qualifier))
|
||||
$2.arraySizes = 0;
|
||||
$2.arraySizes = nullptr;
|
||||
|
||||
parseContext.checkNoShaderLayouts($2.loc, $1.shaderQualifiers);
|
||||
$2.shaderQualifiers.merge($1.shaderQualifiers);
|
||||
|
|
@ -1352,7 +1354,7 @@ type_specifier
|
|||
$$.qualifier.precision = parseContext.getDefaultPrecision($$);
|
||||
}
|
||||
| type_specifier_nonarray array_specifier {
|
||||
parseContext.arrayDimCheck($2.loc, $2.arraySizes, 0);
|
||||
parseContext.arrayOfArrayVersionCheck($2.loc, $2.arraySizes);
|
||||
$$ = $1;
|
||||
$$.qualifier.precision = parseContext.getDefaultPrecision($$);
|
||||
$$.arraySizes = $2.arraySizes;
|
||||
|
|
@ -3110,8 +3112,12 @@ struct_declaration
|
|||
parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier);
|
||||
|
||||
for (unsigned int i = 0; i < $$->size(); ++i) {
|
||||
parseContext.arrayDimCheck($1.loc, (*$$)[i].type, $1.arraySizes);
|
||||
(*$$)[i].type->mergeType($1);
|
||||
TType type($1);
|
||||
type.setFieldName((*$$)[i].type->getFieldName());
|
||||
type.transferArraySizes((*$$)[i].type->getArraySizes());
|
||||
type.copyArrayInnerSizes($1.arraySizes);
|
||||
parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes());
|
||||
(*$$)[i].type->shallowCopy(type);
|
||||
}
|
||||
}
|
||||
| type_qualifier type_specifier struct_declarator_list SEMICOLON {
|
||||
|
|
@ -3131,8 +3137,12 @@ struct_declaration
|
|||
parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier);
|
||||
|
||||
for (unsigned int i = 0; i < $$->size(); ++i) {
|
||||
parseContext.arrayDimCheck($1.loc, (*$$)[i].type, $2.arraySizes);
|
||||
(*$$)[i].type->mergeType($2);
|
||||
TType type($2);
|
||||
type.setFieldName((*$$)[i].type->getFieldName());
|
||||
type.transferArraySizes((*$$)[i].type->getArraySizes());
|
||||
type.copyArrayInnerSizes($2.arraySizes);
|
||||
parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes());
|
||||
(*$$)[i].type->shallowCopy(type);
|
||||
}
|
||||
}
|
||||
;
|
||||
|
|
@ -3154,12 +3164,12 @@ struct_declarator
|
|||
$$.type->setFieldName(*$1.string);
|
||||
}
|
||||
| IDENTIFIER array_specifier {
|
||||
parseContext.arrayDimCheck($1.loc, $2.arraySizes, 0);
|
||||
parseContext.arrayOfArrayVersionCheck($1.loc, $2.arraySizes);
|
||||
|
||||
$$.type = new TType(EbtVoid);
|
||||
$$.loc = $1.loc;
|
||||
$$.type->setFieldName(*$1.string);
|
||||
$$.type->newArraySizes(*$2.arraySizes);
|
||||
$$.type->transferArraySizes($2.arraySizes);
|
||||
}
|
||||
;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue