Regression: Broken type of constant initialized with cast from bitstruct #1811

This commit is contained in:
Christoffer Lerno
2025-01-11 23:17:38 +01:00
parent 8785c2c46f
commit 50fdf9900d
2 changed files with 21 additions and 0 deletions

View File

@@ -9961,7 +9961,9 @@ bool sema_cast_const(Expr *expr)
case EXPR_RECAST:
if (sema_cast_const(expr->inner_expr))
{
Type *type = expr->type;
expr_replace(expr, expr->inner_expr);
expr->type = type;
return true;
}
return false;

View File

@@ -0,0 +1,19 @@
module test;
// Issue #1811
bitstruct Image_Tag : uint
{
char x1 : 24..31;
char x2 : 16..23;
char x3 : 8..15;
char x4 : 0..7;
}
distinct Glyph_Format = CInt;
const Glyph_Format GLYPH_FORMAT_BITMAP = (Glyph_Format)Image_Tag {'b', 'i', 't', 's'};
fn void main() {
// Error: Implicitly casting 'Image_Tag' to 'Glyph_Format' is not permitted
Glyph_Format format = GLYPH_FORMAT_BITMAP;
// Error: 'Glyph_Format' and 'Image_Tag' are different types and cannot be compared.
assert(format == GLYPH_FORMAT_BITMAP);
}