Browse Source

Disallow `where` clauses on non-polymorphic records

gingerBill 6 years ago
parent
commit
42bbd31df1
1 changed files with 10 additions and 2 deletions
  1. 10 2
      src/check_type.cpp

+ 10 - 2
src/check_type.cpp

@@ -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) {