const/volatile/unsigned/signed type operators

This commit is contained in:
Ryan Fleury
2026-07-27 14:47:06 -07:00
parent 78d12eb914
commit 0963f4a6de
5 changed files with 170 additions and 67 deletions
+58
View File
@@ -2486,6 +2486,64 @@ e2_compile_from_expr(Arena *arena, E2_CompileState *state, E2_IRNode *resolve_re
scratch_end(scratch);
}break;
//- rjf: const type operator
case E2_ExprKind_Const:
{
E2_TypeKey const_type_key = e2_type_key_cons(E2_TypeKind_Modifier, .flags = E2_TypeFlag_Const, .direct = lhs->type_key);
finished_root = e2_irnode(arena);
finished_root->type_key = const_type_key;
}break;
//- rjf: volatile type operator
case E2_ExprKind_Volatile:
{
E2_TypeKey volatile_type_key = e2_type_key_cons(E2_TypeKind_Modifier, .flags = E2_TypeFlag_Volatile, .direct = lhs->type_key);
finished_root = e2_irnode(arena);
finished_root->type_key = volatile_type_key;
}break;
//- rjf: unsigned type operator
case E2_ExprKind_Unsigned:
{
E2_TypeKey unsigned_type_key = lhs->type_key;
E2_TypeKey int_type_key = e2_type_key_undecorate(lhs->type_key);
E2_TypeKind int_type_kind = e2_type_kind_from_key(int_type_key);
switch(int_type_kind)
{
default:{}break;
case E2_TypeKind_S8: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U8);}break;
case E2_TypeKind_S16: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U16);}break;
case E2_TypeKind_S32: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U32);}break;
case E2_TypeKind_S64: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U64);}break;
case E2_TypeKind_S128:{unsigned_type_key = e2_type_key_basic(E2_TypeKind_U128);}break;
case E2_TypeKind_S256:{unsigned_type_key = e2_type_key_basic(E2_TypeKind_U256);}break;
case E2_TypeKind_S512:{unsigned_type_key = e2_type_key_basic(E2_TypeKind_U512);}break;
}
finished_root = e2_irnode(arena);
finished_root->type_key = unsigned_type_key;
}break;
//- rjf: signed type operator
case E2_ExprKind_Signed:
{
E2_TypeKey signed_type_key = lhs->type_key;
E2_TypeKey int_type_key = e2_type_key_undecorate(lhs->type_key);
E2_TypeKind int_type_kind = e2_type_kind_from_key(int_type_key);
switch(int_type_kind)
{
default:{}break;
case E2_TypeKind_U8: {signed_type_key = e2_type_key_basic(E2_TypeKind_S8);}break;
case E2_TypeKind_U16: {signed_type_key = e2_type_key_basic(E2_TypeKind_S16);}break;
case E2_TypeKind_U32: {signed_type_key = e2_type_key_basic(E2_TypeKind_S32);}break;
case E2_TypeKind_U64: {signed_type_key = e2_type_key_basic(E2_TypeKind_S64);}break;
case E2_TypeKind_U128:{signed_type_key = e2_type_key_basic(E2_TypeKind_S128);}break;
case E2_TypeKind_U256:{signed_type_key = e2_type_key_basic(E2_TypeKind_S256);}break;
case E2_TypeKind_U512:{signed_type_key = e2_type_key_basic(E2_TypeKind_S512);}break;
}
finished_root = e2_irnode(arena);
finished_root->type_key = signed_type_key;
}break;
//- rjf: leaf numerics
case E2_ExprKind_Numeric:
{
+8
View File
@@ -147,11 +147,19 @@ struct E2_TypeKeyList
////////////////////////////////
//~ rjf: Constructed Type Cache Types
typedef U32 E2_TypeFlags;
enum
{
E2_TypeFlag_Const = (1<<0),
E2_TypeFlag_Volatile = (1<<1),
};
typedef struct E2_ConsTypeParams E2_ConsTypeParams;
struct E2_ConsTypeParams
{
Arch arch;
E2_TypeKind kind;
E2_TypeFlags flags;
String8 name;
E2_TypeKey direct;
U64 count;
+16 -3
View File
@@ -4,15 +4,24 @@
@table(name allow_type_operands is_type_expression is_first_operand_type_maybe target_operand_count)
E2_ExprKindTable:
{
//- rjf: leaves
{Identifier 0 0 0 0 }
{MacroArg 0 0 0 0 }
{TypeIdentifier 0 1 0 0 }
{Ptr 1 1 1 1 }
{Array 1 1 1 2 }
{Function 1 1 1 0xffffffffffffffffull}
{Numeric 0 0 0 0 }
{StringLiteral 0 0 0 0 }
{CharLiteral 0 0 0 0 }
//- rjf: type operators
{Ptr 1 1 1 1 }
{Array 1 1 1 2 }
{Function 1 1 1 0xffffffffffffffffull}
{Const 1 1 1 1 }
{Volatile 1 1 1 1 }
{Unsigned 1 1 1 1 }
{Signed 1 1 1 1 }
//- rjf: operators
{Dot 1 0 0 1 }
{Index 0 0 0 2 }
{Call 0 0 0 0xffffffffffffffffull}
@@ -122,6 +131,10 @@ E2_ExprKindParseInfoTable_CLike:
{Call Postfix 1 "" "(" ")" "," 0}
{Function Postfix 1 "" "(" ")" "," 0}
{DerefAsm Prefix 1 "[" "" "]" "" 0}
{Unsigned Prefix 1 "unsigned " "" "" "" 0}
{Signed Prefix 1 "signed " "" "" "" 0}
{Volatile Prefix 1 "volatile " "" "" "" 0}
{Const Prefix 1 "const " "" "" "" 0}
{SizeOf Prefix 1 "sizeof " "" "" "" 0}
{TypeOf Prefix 1 "typeof " "" "" "" 0}
{SizeOf Prefix 1 "size_of " "" "" "" 0}
+37 -17
View File
@@ -4,19 +4,23 @@
//- GENERATED CODE
C_LINKAGE_BEGIN
B8 e2_expr_kind_allow_type_operands_table[44] =
B8 e2_expr_kind_allow_type_operands_table[48] =
{
0,
0,
0,
0,
1,
1,
1,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1,
0,
0,
1,
@@ -52,18 +56,22 @@ B8 e2_expr_kind_allow_type_operands_table[44] =
1,
};
B8 e2_expr_kind_is_type_expr_table[44] =
B8 e2_expr_kind_is_type_expr_table[48] =
{
0,
0,
0,
1,
1,
1,
1,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
0,
0,
0,
@@ -100,18 +108,22 @@ B8 e2_expr_kind_is_type_expr_table[44] =
0,
};
B8 e2_expr_kind_is_first_operand_type_maybe_table[44] =
B8 e2_expr_kind_is_first_operand_type_maybe_table[48] =
{
0,
0,
0,
0,
1,
1,
1,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
0,
0,
0,
@@ -148,18 +160,22 @@ B8 e2_expr_kind_is_first_operand_type_maybe_table[44] =
0,
};
U64 e2_expr_kind_target_operand_count_table[44] =
U64 e2_expr_kind_target_operand_count_table[48] =
{
0,
0,
0,
0,
0,
0,
0,
1,
2,
0xffffffffffffffffull,
0,
0,
0,
1,
1,
1,
1,
1,
2,
0xffffffffffffffffull,
@@ -201,13 +217,17 @@ E2_LangInfo e2_lang_kind_info_table[1] =
{ArrayCount(e2_expr_kind_parse_info_table__clike), (e2_expr_kind_parse_info_table__clike)},
};
E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[39] =
E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[43] =
{
{E2_ExprKind_Dot, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_Index, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]"), str8_lit_comp("")},
{E2_ExprKind_Call, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(",")},
{E2_ExprKind_Function, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(",")},
{E2_ExprKind_DerefAsm, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("["), str8_lit_comp(""), str8_lit_comp("]"), str8_lit_comp("")},
{E2_ExprKind_Unsigned, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("unsigned "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_Signed, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("signed "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_Volatile, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("volatile "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_Const, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("const "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_SizeOf, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("sizeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_TypeOf, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("typeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
{E2_ExprKind_SizeOf, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("size_of "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")},
+12 -8
View File
@@ -12,12 +12,16 @@ E2_ExprKind_Null,
E2_ExprKind_Identifier,
E2_ExprKind_MacroArg,
E2_ExprKind_TypeIdentifier,
E2_ExprKind_Ptr,
E2_ExprKind_Array,
E2_ExprKind_Function,
E2_ExprKind_Numeric,
E2_ExprKind_StringLiteral,
E2_ExprKind_CharLiteral,
E2_ExprKind_Ptr,
E2_ExprKind_Array,
E2_ExprKind_Function,
E2_ExprKind_Const,
E2_ExprKind_Volatile,
E2_ExprKind_Unsigned,
E2_ExprKind_Signed,
E2_ExprKind_Dot,
E2_ExprKind_Index,
E2_ExprKind_Call,
@@ -159,12 +163,12 @@ E2_ExprKindParseInfo *expr_kind_parse_infos;
};
C_LINKAGE_BEGIN
extern B8 e2_expr_kind_allow_type_operands_table[44];
extern B8 e2_expr_kind_is_type_expr_table[44];
extern B8 e2_expr_kind_is_first_operand_type_maybe_table[44];
extern U64 e2_expr_kind_target_operand_count_table[44];
extern B8 e2_expr_kind_allow_type_operands_table[48];
extern B8 e2_expr_kind_is_type_expr_table[48];
extern B8 e2_expr_kind_is_first_operand_type_maybe_table[48];
extern U64 e2_expr_kind_target_operand_count_table[48];
extern E2_LangInfo e2_lang_kind_info_table[1];
extern E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[39];
extern E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[43];
extern U8 e2_type_kind_basic_byte_size_table[61];
extern String8 e2_type_kind_basic_string_table[61];