mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 03:51:18 +00:00
- Comparing a flexible array member to another type would hit an assert. #2830
- Underlying slice type not checked correctly in $defined #2829 - Checking for exhaustive cases is done even in if-chain switch if all is enum #2828
This commit is contained in:
@@ -110,6 +110,9 @@
|
|||||||
- $typeof(<type>) returns typeinfo, causing errors #2795.
|
- $typeof(<type>) returns typeinfo, causing errors #2795.
|
||||||
- Empty ichar slice + byte concatenation hit an assert. #2789
|
- Empty ichar slice + byte concatenation hit an assert. #2789
|
||||||
- Remove dependency on test tmp library for stdlib compiler tests. #2800
|
- Remove dependency on test tmp library for stdlib compiler tests. #2800
|
||||||
|
- Comparing a flexible array member to another type would hit an assert. #2830
|
||||||
|
- Underlying slice type not checked correctly in $defined #2829
|
||||||
|
- Checking for exhaustive cases is done even in if-chain switch if all is enum #2828
|
||||||
|
|
||||||
### Stdlib changes
|
### Stdlib changes
|
||||||
- Add `ThreadPool` join function to wait for all threads to finish in the pool without destroying the threads.
|
- Add `ThreadPool` join function to wait for all threads to finish in the pool without destroying the threads.
|
||||||
|
|||||||
@@ -10564,6 +10564,13 @@ RETRY:
|
|||||||
Type *type = sema_expr_check_type_exists(context, type_info->array.base);
|
Type *type = sema_expr_check_type_exists(context, type_info->array.base);
|
||||||
if (!type) return NULL;
|
if (!type) return NULL;
|
||||||
if (!type_ok(type)) return type;
|
if (!type_ok(type)) return type;
|
||||||
|
if (!type_is_valid_for_array(type))
|
||||||
|
{
|
||||||
|
SEMA_ERROR(type_info->array.base,
|
||||||
|
"You cannot form a slice with elements of type %s.",
|
||||||
|
type_quoted_error_string(type));
|
||||||
|
return poisoned_type;
|
||||||
|
}
|
||||||
return type_get_slice(type);
|
return type_get_slice(type);
|
||||||
}
|
}
|
||||||
case TYPE_INFO_INFERRED_ARRAY:
|
case TYPE_INFO_INFERRED_ARRAY:
|
||||||
@@ -10572,6 +10579,13 @@ RETRY:
|
|||||||
Type *type = sema_expr_check_type_exists(context, type_info->array.base);
|
Type *type = sema_expr_check_type_exists(context, type_info->array.base);
|
||||||
if (!type) return NULL;
|
if (!type) return NULL;
|
||||||
if (!type_ok(type)) return type;
|
if (!type_ok(type)) return type;
|
||||||
|
if (!type_is_valid_for_array(type))
|
||||||
|
{
|
||||||
|
SEMA_ERROR(type_info->array.base,
|
||||||
|
"You cannot form an array with elements of type %s.",
|
||||||
|
type_quoted_error_string(type));
|
||||||
|
return poisoned_type;
|
||||||
|
}
|
||||||
return type_get_inferred_array(type);
|
return type_get_inferred_array(type);
|
||||||
}
|
}
|
||||||
case TYPE_INFO_INFERRED_VECTOR:
|
case TYPE_INFO_INFERRED_VECTOR:
|
||||||
@@ -10580,6 +10594,13 @@ RETRY:
|
|||||||
Type *type = sema_expr_check_type_exists(context, type_info->array.base);
|
Type *type = sema_expr_check_type_exists(context, type_info->array.base);
|
||||||
if (!type) return NULL;
|
if (!type) return NULL;
|
||||||
if (!type_ok(type)) return type;
|
if (!type_ok(type)) return type;
|
||||||
|
if (!type_is_valid_for_vector(type))
|
||||||
|
{
|
||||||
|
SEMA_ERROR(type_info->array.base,
|
||||||
|
"%s is not of a vectorizable type.",
|
||||||
|
type_quoted_error_string(type));
|
||||||
|
return poisoned_type;
|
||||||
|
}
|
||||||
return type_get_inferred_vector(type);
|
return type_get_inferred_vector(type);
|
||||||
}
|
}
|
||||||
case TYPE_INFO_POINTER:
|
case TYPE_INFO_POINTER:
|
||||||
|
|||||||
@@ -2648,7 +2648,7 @@ FOUND:;
|
|||||||
all_jump_end &= context->active_scope.end_jump.active;
|
all_jump_end &= context->active_scope.end_jump.active;
|
||||||
SCOPE_END;
|
SCOPE_END;
|
||||||
}
|
}
|
||||||
if (is_enum_switch && !exhaustive && success)
|
if (is_enum_switch && !exhaustive && success && !if_chain)
|
||||||
{
|
{
|
||||||
RETURN_SEMA_ERROR(statement, create_missing_enums_in_switch_error(cases, actual_enum_cases, enum_values));
|
RETURN_SEMA_ERROR(statement, create_missing_enums_in_switch_error(cases, actual_enum_cases, enum_values));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1066,6 +1066,10 @@ Type *type_get_optional(Type *optional_type)
|
|||||||
|
|
||||||
Type *type_get_slice(Type *arr_type)
|
Type *type_get_slice(Type *arr_type)
|
||||||
{
|
{
|
||||||
|
if (!type_is_valid_for_array(arr_type))
|
||||||
|
{
|
||||||
|
puts("ofek");
|
||||||
|
}
|
||||||
ASSERT(type_is_valid_for_array(arr_type));
|
ASSERT(type_is_valid_for_array(arr_type));
|
||||||
return type_generate_slice(arr_type, false);
|
return type_generate_slice(arr_type, false);
|
||||||
}
|
}
|
||||||
@@ -2273,6 +2277,7 @@ RETRY_DISTINCT:
|
|||||||
// array + [other array, vector] => no
|
// array + [other array, vector] => no
|
||||||
return NULL;
|
return NULL;
|
||||||
case TYPE_FLEXIBLE_ARRAY:
|
case TYPE_FLEXIBLE_ARRAY:
|
||||||
|
return NULL;
|
||||||
case TYPE_INFERRED_ARRAY:
|
case TYPE_INFERRED_ARRAY:
|
||||||
case TYPE_INFERRED_VECTOR:
|
case TYPE_INFERRED_VECTOR:
|
||||||
// Already handled
|
// Already handled
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
fn void test1()
|
||||||
|
{
|
||||||
|
bool a = $defined(void[]); // #error: You cannot form a slice with elements of type
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
fn void test2()
|
||||||
|
{
|
||||||
|
bool b = $defined(void[*]); // #error: You cannot form an array with elements of type
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
fn void test1()
|
||||||
|
{
|
||||||
|
bool a = $defined(void[<*>]); // #error: 'void' is not of a vectorizable type
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
enum Baz
|
||||||
|
{
|
||||||
|
A, B, C,
|
||||||
|
}
|
||||||
|
fn void test_missing_all_cases(Baz x)
|
||||||
|
{
|
||||||
|
switch (x)
|
||||||
|
{
|
||||||
|
case x:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn int main() => 0;
|
||||||
10
test/test_suite/struct/flex_array_max_type.c3
Normal file
10
test/test_suite/struct/flex_array_max_type.c3
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
struct Abc
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int[*] y;
|
||||||
|
}
|
||||||
|
fn void test()
|
||||||
|
{
|
||||||
|
Abc y;
|
||||||
|
bool same = Abc.y == y.y; // #error: 'member_ref' and 'int[*]' are different types and cannot be compared
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user