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:
John Kessenich 2018-03-26 00:38:53 -06:00
parent 1c3ab274b1
commit 859b0342b8
17 changed files with 1323 additions and 1289 deletions

View file

@ -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);
}
;