mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Add -no-dynamic-literals to disallow dynamic array and map literals
This commit is contained in:
@@ -17,7 +17,7 @@ Thread_Priority :: enum {
|
|||||||
High,
|
High,
|
||||||
}
|
}
|
||||||
|
|
||||||
_thread_priority_map := map[Thread_Priority]i32{
|
_thread_priority_map := [Thread_Priority]i32{
|
||||||
.Normal = 0,
|
.Normal = 0,
|
||||||
.Low = -2,
|
.Low = -2,
|
||||||
.High = +2,
|
.High = +2,
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ struct BuildContext {
|
|||||||
bool keep_temp_files;
|
bool keep_temp_files;
|
||||||
bool ignore_unknown_attributes;
|
bool ignore_unknown_attributes;
|
||||||
bool no_bounds_check;
|
bool no_bounds_check;
|
||||||
|
bool no_dynamic_literals;
|
||||||
bool no_output_files;
|
bool no_output_files;
|
||||||
bool no_crt;
|
bool no_crt;
|
||||||
bool use_lld;
|
bool use_lld;
|
||||||
|
|||||||
+18
-5
@@ -8455,8 +8455,10 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
|||||||
context_name = str_lit("dynamic array literal");
|
context_name = str_lit("dynamic array literal");
|
||||||
is_constant = false;
|
is_constant = false;
|
||||||
|
|
||||||
add_package_dependency(c, "runtime", "__dynamic_array_reserve");
|
if (!build_context.no_dynamic_literals) {
|
||||||
add_package_dependency(c, "runtime", "__dynamic_array_append");
|
add_package_dependency(c, "runtime", "__dynamic_array_reserve");
|
||||||
|
add_package_dependency(c, "runtime", "__dynamic_array_append");
|
||||||
|
}
|
||||||
} else if (t->kind == Type_SimdVector) {
|
} else if (t->kind == Type_SimdVector) {
|
||||||
elem_type = t->SimdVector.elem;
|
elem_type = t->SimdVector.elem;
|
||||||
context_name = str_lit("simd vector literal");
|
context_name = str_lit("simd vector literal");
|
||||||
@@ -8581,7 +8583,6 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
|||||||
cl->max_count = max;
|
cl->max_count = max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
isize index = 0;
|
isize index = 0;
|
||||||
for (; index < cl->elems.count; index++) {
|
for (; index < cl->elems.count; index++) {
|
||||||
@@ -8632,6 +8633,14 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
|||||||
error(node, "Compound literals are not allowed with intrinsics.x86_mmx");
|
error(node, "Compound literals are not allowed with intrinsics.x86_mmx");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (t->kind == Type_DynamicArray) {
|
||||||
|
if (build_context.no_dynamic_literals && cl->elems.count) {
|
||||||
|
error(node, "Compound literals of dynamic types have been disabled");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8940,8 +8949,12 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
add_package_dependency(c, "runtime", "__dynamic_map_reserve");
|
if (build_context.no_dynamic_literals && cl->elems.count) {
|
||||||
add_package_dependency(c, "runtime", "__dynamic_map_set");
|
error(node, "Compound literals of dynamic types have been disabled");
|
||||||
|
} else {
|
||||||
|
add_package_dependency(c, "runtime", "__dynamic_map_reserve");
|
||||||
|
add_package_dependency(c, "runtime", "__dynamic_map_set");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -740,6 +740,7 @@ void init_universal(void) {
|
|||||||
add_global_constant(str_lit("ODIN_DEBUG"), t_untyped_bool, exact_value_bool(bc->ODIN_DEBUG));
|
add_global_constant(str_lit("ODIN_DEBUG"), t_untyped_bool, exact_value_bool(bc->ODIN_DEBUG));
|
||||||
add_global_constant(str_lit("ODIN_DISABLE_ASSERT"), t_untyped_bool, exact_value_bool(bc->ODIN_DISABLE_ASSERT));
|
add_global_constant(str_lit("ODIN_DISABLE_ASSERT"), t_untyped_bool, exact_value_bool(bc->ODIN_DISABLE_ASSERT));
|
||||||
add_global_constant(str_lit("ODIN_USE_LLVM_API"), t_untyped_bool, exact_value_bool(bc->use_llvm_api));
|
add_global_constant(str_lit("ODIN_USE_LLVM_API"), t_untyped_bool, exact_value_bool(bc->use_llvm_api));
|
||||||
|
add_global_constant(str_lit("ODIN_NO_DYNAMIC_LITERALS"), t_untyped_bool, exact_value_bool(bc->no_dynamic_literals));
|
||||||
|
|
||||||
|
|
||||||
// Builtin Procedures
|
// Builtin Procedures
|
||||||
|
|||||||
+25
-19
@@ -572,6 +572,7 @@ enum BuildFlagKind {
|
|||||||
BuildFlag_Debug,
|
BuildFlag_Debug,
|
||||||
BuildFlag_DisableAssert,
|
BuildFlag_DisableAssert,
|
||||||
BuildFlag_NoBoundsCheck,
|
BuildFlag_NoBoundsCheck,
|
||||||
|
BuildFlag_NoDynamicLiterals,
|
||||||
BuildFlag_NoCRT,
|
BuildFlag_NoCRT,
|
||||||
BuildFlag_UseLLD,
|
BuildFlag_UseLLD,
|
||||||
BuildFlag_Vet,
|
BuildFlag_Vet,
|
||||||
@@ -652,25 +653,26 @@ ExactValue build_param_to_exact_value(String name, String param) {
|
|||||||
|
|
||||||
bool parse_build_flags(Array<String> args) {
|
bool parse_build_flags(Array<String> args) {
|
||||||
auto build_flags = array_make<BuildFlag>(heap_allocator(), 0, BuildFlag_COUNT);
|
auto build_flags = array_make<BuildFlag>(heap_allocator(), 0, BuildFlag_COUNT);
|
||||||
add_flag(&build_flags, BuildFlag_Help, str_lit("help"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_Help, str_lit("help"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String);
|
add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String);
|
||||||
add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer);
|
add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer);
|
||||||
add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_ShowSystemCalls, str_lit("show-system-calls"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_ShowSystemCalls, str_lit("show-system-calls"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_ThreadCount, str_lit("thread-count"), BuildFlagParam_Integer);
|
add_flag(&build_flags, BuildFlag_ThreadCount, str_lit("thread-count"), BuildFlagParam_Integer);
|
||||||
add_flag(&build_flags, BuildFlag_KeepTempFiles, str_lit("keep-temp-files"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_KeepTempFiles, str_lit("keep-temp-files"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_Collection, str_lit("collection"), BuildFlagParam_String);
|
add_flag(&build_flags, BuildFlag_Collection, str_lit("collection"), BuildFlagParam_String);
|
||||||
add_flag(&build_flags, BuildFlag_Define, str_lit("define"), BuildFlagParam_String);
|
add_flag(&build_flags, BuildFlag_Define, str_lit("define"), BuildFlagParam_String);
|
||||||
add_flag(&build_flags, BuildFlag_BuildMode, str_lit("build-mode"), BuildFlagParam_String);
|
add_flag(&build_flags, BuildFlag_BuildMode, str_lit("build-mode"), BuildFlagParam_String);
|
||||||
add_flag(&build_flags, BuildFlag_Target, str_lit("target"), BuildFlagParam_String);
|
add_flag(&build_flags, BuildFlag_Target, str_lit("target"), BuildFlagParam_String);
|
||||||
add_flag(&build_flags, BuildFlag_Debug, str_lit("debug"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_Debug, str_lit("debug"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_UseLLVMApi, str_lit("llvm-api"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None);
|
||||||
|
add_flag(&build_flags, BuildFlag_UseLLVMApi, str_lit("llvm-api"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None);
|
add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None);
|
||||||
add_flag(&build_flags, BuildFlag_ExtraLinkerFlags, str_lit("extra-linker-flags"), BuildFlagParam_String);
|
add_flag(&build_flags, BuildFlag_ExtraLinkerFlags, str_lit("extra-linker-flags"), BuildFlagParam_String);
|
||||||
|
|
||||||
@@ -1068,6 +1070,10 @@ bool parse_build_flags(Array<String> args) {
|
|||||||
build_context.no_bounds_check = true;
|
build_context.no_bounds_check = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BuildFlag_NoDynamicLiterals:
|
||||||
|
build_context.no_dynamic_literals = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case BuildFlag_NoCRT:
|
case BuildFlag_NoCRT:
|
||||||
build_context.no_crt = true;
|
build_context.no_crt = true;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user