|
@@ -503,7 +503,11 @@ void check_struct_type(CheckerContext *ctx, Type *struct_type, Ast *node, Array<
|
|
struct_type->Struct.is_poly_specialized = is_poly_specialized;
|
|
struct_type->Struct.is_poly_specialized = is_poly_specialized;
|
|
|
|
|
|
if (!is_polymorphic) {
|
|
if (!is_polymorphic) {
|
|
- bool where_clause_ok = evaluate_where_clauses(ctx, ctx->scope, &st->where_clauses, true);
|
|
|
|
|
|
+ if (st->where_clauses.count > 0 && st->polymorphic_params != nullptr) {
|
|
|
|
+ error(st->where_clauses[0], "'where' clauses can only be used on structures with polymorphic parameters");
|
|
|
|
+ } else {
|
|
|
|
+ bool where_clause_ok = evaluate_where_clauses(ctx, ctx->scope, &st->where_clauses, true);
|
|
|
|
+ }
|
|
check_struct_fields(ctx, node, &struct_type->Struct.fields, &struct_type->Struct.tags, st->fields, min_field_count, struct_type, context);
|
|
check_struct_fields(ctx, node, &struct_type->Struct.fields, &struct_type->Struct.tags, st->fields, min_field_count, struct_type, context);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -686,7 +690,11 @@ void check_union_type(CheckerContext *ctx, Type *union_type, Ast *node, Array<Op
|
|
union_type->Union.is_polymorphic = is_polymorphic;
|
|
union_type->Union.is_polymorphic = is_polymorphic;
|
|
union_type->Union.is_poly_specialized = is_poly_specialized;
|
|
union_type->Union.is_poly_specialized = is_poly_specialized;
|
|
|
|
|
|
- bool where_clause_ok = evaluate_where_clauses(ctx, ctx->scope, &ut->where_clauses, true);
|
|
|
|
|
|
+ if (ut->where_clauses.count > 0 && ut->polymorphic_params != nullptr) {
|
|
|
|
+ error(ut->where_clauses[0], "'where' clauses can only be used on unions with polymorphic parameters");
|
|
|
|
+ } else {
|
|
|
|
+ bool where_clause_ok = evaluate_where_clauses(ctx, ctx->scope, &ut->where_clauses, true);
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
for_array(i, ut->variants) {
|
|
for_array(i, ut->variants) {
|