@@ -230,36 +230,54 @@ fn QualType Analyser.analyseTypeRef(Analyser* ma, TypeRef* ref) {
230230 u32 num_arrays = ref.getNumArrays();
231231 // Note: iterate in reverse, since outer array comes first
232232 for (u32 i=num_arrays; i>0; i--) {
233- Expr* sizeExpr = ref.getArray(i-1); // note: ImplicitCast could have been inserted
233+ Expr** sizeExpr_p = ref.getArray2(i - 1);
234+ Expr* sizeExpr = *sizeExpr_p;
234235 u32 size = 0;
236+ bool is_enum = false;
237+ QualType qt = QualType_Invalid;
235238 if (sizeExpr) {
236- QualType qt = ma.analyseExpr(ref.getArray2(i-1), true , RHS);
239+ qt = ma.analyseExpr(sizeExpr_p, false , RHS);
237240 if (qt.isInvalid()) return qt;
238- sizeExpr = ref.getArray(i-1); // note: ImplicitCast could have been inserted
239-
240- // TODO canonical?
241- if (!qt.isInteger()) {
242- ma.error(ref.getLoc(), "array size has non-integer type '%s'", qt.diagName());
243- return QualType_Invalid;
244- }
245-
246- if (!sizeExpr.isCtv()) {
247- ma.errorRange(sizeExpr.getLoc(), sizeExpr.getRange(), "array size is not a compile-time value");
248- return QualType_Invalid;
249- }
250-
251- Value value = ast.evalExpr(sizeExpr);
252- if (value.isNegative()) {
253- ma.errorRange(sizeExpr.getLoc(), sizeExpr.getRange(), "array size has negative value '%s'", value.str());
254- return QualType_Invalid;
241+ sizeExpr = *sizeExpr_p;
242+ if (sizeExpr.isNValue()) {
243+ const EnumType* et = qt.getEnumTypeOrNil();
244+ if (!et) {
245+ ma.error(ref.getLoc(), "array size must be an integer or an enum type ('%s')", qt.diagName());
246+ return QualType_Invalid;
247+ }
248+ const EnumTypeDecl* etd = et.getDecl();
249+ is_enum = true;
250+ size = etd.getNumConstants();
251+ } else {
252+ qt = ma.convertRvalue(sizeExpr_p, qt);
253+ if (qt.isInvalid()) return qt;
254+
255+ sizeExpr = *sizeExpr_p; // note: ImplicitCast could have been inserted
256+
257+ // TODO canonical?
258+ if (!qt.isInteger()) {
259+ ma.error(ref.getLoc(), "array size has non-integer type '%s'", qt.diagName());
260+ return QualType_Invalid;
261+ }
262+
263+ if (!sizeExpr.isCtv()) {
264+ ma.errorRange(sizeExpr.getLoc(), sizeExpr.getRange(), "array size is not a compile-time value");
265+ return QualType_Invalid;
266+ }
267+
268+ Value value = ast.evalExpr(sizeExpr);
269+ if (value.isNegative()) {
270+ ma.errorRange(sizeExpr.getLoc(), sizeExpr.getRange(), "array size has negative value '%s'", value.str());
271+ return QualType_Invalid;
272+ }
273+ size = value.as_u32();
255274 }
256- size = value.as_u32();
257275 }
258276 if (resolved.isVoid()) {
259277 ma.error(ref.getLoc(), "array element has invalid type 'void'");
260278 return QualType_Invalid;
261279 }
262- resolved = ma.builder.actOnArrayType(resolved, sizeExpr != nil, size);
280+ resolved = ma.builder.actOnArrayType(resolved, sizeExpr != nil, size, is_enum, qt );
263281 }
264282 if (ref.isIncrArray()) {
265283 resolved = ma.builder.actOnIncrementalArrayType(resolved);
@@ -296,7 +314,7 @@ fn QualType Analyser.analyseIncrTypeRef(Analyser* ma, TypeRef* ref, u32 size) {
296314 return QualType_Invalid;
297315 }
298316 // always insert a one-dimensional array with size entries
299- resolved = ma.builder.actOnArrayType(resolved, true, size);
317+ resolved = ma.builder.actOnArrayType(resolved, true, size, false, QualType_Invalid );
300318
301319 if (ref.isUser()) ref.setDest(base.getIndex());
302320 return resolved;
0 commit comments