From 7c3636aaa38e8efa77b73ba94362802517ea739e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 13 Sep 2018 15:46:34 -0400 Subject: [PATCH] remove the scope parameter of setFloatMode also document that scopes inherit this value. See #367 See #1283 --- doc/langref.html.in | 18 +++++++---- src/all_types.hpp | 2 +- src/codegen.cpp | 12 +++---- src/ir.cpp | 72 +++++++++++++++-------------------------- test/cases/eval.zig | 2 +- test/compile_errors.zig | 4 +-- 6 files changed, 47 insertions(+), 63 deletions(-) diff --git a/doc/langref.html.in b/doc/langref.html.in index 6f12f0339f..aefbfc5650 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -734,7 +734,7 @@ export fn foo_strict(x: f64) f64 { } export fn foo_optimized(x: f64) f64 { - @setFloatMode(this, builtin.FloatMode.Optimized); + @setFloatMode(builtin.FloatMode.Optimized); return x + big - big; } {#code_end#} @@ -6030,17 +6030,20 @@ test "foo" { {#see_also|comptime#} {#header_close#} {#header_open|@setFloatMode#} -
@setFloatMode(scope, mode: @import("builtin").FloatMode)
+
@setFloatMode(mode: @import("builtin").FloatMode)

- Sets the floating point mode for a given scope. Possible values are: + Sets the floating point mode of the current scope. Possible values are:

{#code_begin|syntax#} pub const FloatMode = enum { - Optimized, Strict, + Optimized, }; {#code_end#} +

+ The floating point mode is inherited by child scopes, and can be overridden in any scope. + You can set the floating point mode in a struct or module scope by using a comptime block. +

{#see_also|Floating Point Operations#} {#header_close#} {#header_open|@setGlobalLinkage#} diff --git a/src/all_types.hpp b/src/all_types.hpp index 8aa2718d30..27871156d6 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -3287,8 +3287,8 @@ static const size_t stack_trace_ptr_count = 30; enum FloatMode { - FloatModeOptimized, FloatModeStrict, + FloatModeOptimized, }; enum FnWalkId { diff --git a/src/codegen.cpp b/src/codegen.cpp index 4e28613285..38f31074d0 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -6729,7 +6729,7 @@ static void define_builtin_fns(CodeGen *g) { create_builtin_fn(g, BuiltinFnIdIntType, "IntType", 2); // TODO rename to Int create_builtin_fn(g, BuiltinFnIdSetCold, "setCold", 1); create_builtin_fn(g, BuiltinFnIdSetRuntimeSafety, "setRuntimeSafety", 1); - create_builtin_fn(g, BuiltinFnIdSetFloatMode, "setFloatMode", 2); + create_builtin_fn(g, BuiltinFnIdSetFloatMode, "setFloatMode", 1); create_builtin_fn(g, BuiltinFnIdPanic, "panic", 1); create_builtin_fn(g, BuiltinFnIdPtrCast, "ptrCast", 2); create_builtin_fn(g, BuiltinFnIdBitCast, "bitCast", 2); @@ -7115,11 +7115,11 @@ Buf *codegen_generate_builtin_source(CodeGen *g) { { buf_appendf(contents, "pub const FloatMode = enum {\n" - " Optimized,\n" " Strict,\n" + " Optimized,\n" "};\n\n"); - assert(FloatModeOptimized == 0); - assert(FloatModeStrict == 1); + assert(FloatModeStrict == 0); + assert(FloatModeOptimized == 1); } { buf_appendf(contents, @@ -7127,8 +7127,8 @@ Buf *codegen_generate_builtin_source(CodeGen *g) { " Big,\n" " Little,\n" "};\n\n"); - assert(FloatModeOptimized == 0); - assert(FloatModeStrict == 1); + //assert(EndianBig == 0); + //assert(EndianLittle == 1); } { const char *endian_str = g->is_big_endian ? "Endian.Big" : "Endian.Little"; diff --git a/src/ir.cpp b/src/ir.cpp index b432facb36..6f1a7a741a 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -1577,13 +1577,11 @@ static IrInstruction *ir_build_set_runtime_safety(IrBuilder *irb, Scope *scope, } static IrInstruction *ir_build_set_float_mode(IrBuilder *irb, Scope *scope, AstNode *source_node, - IrInstruction *scope_value, IrInstruction *mode_value) + IrInstruction *mode_value) { IrInstructionSetFloatMode *instruction = ir_build_instruction(irb, scope, source_node); - instruction->scope_value = scope_value; instruction->mode_value = mode_value; - ir_ref_instruction(scope_value, irb->current_basic_block); ir_ref_instruction(mode_value, irb->current_basic_block); return &instruction->base; @@ -3959,12 +3957,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo if (arg0_value == irb->codegen->invalid_instruction) return arg0_value; - AstNode *arg1_node = node->data.fn_call_expr.params.at(1); - IrInstruction *arg1_value = ir_gen_node(irb, arg1_node, scope); - if (arg1_value == irb->codegen->invalid_instruction) - return arg1_value; - - IrInstruction *set_float_mode = ir_build_set_float_mode(irb, scope, node, arg0_value, arg1_value); + IrInstruction *set_float_mode = ir_build_set_float_mode(irb, scope, node, arg0_value); return ir_lval_wrap(irb, scope, set_float_mode, lval); } case BuiltinFnIdSizeof: @@ -15379,6 +15372,7 @@ static ZigType *ir_analyze_instruction_set_cold(IrAnalyze *ira, IrInstructionSet ir_build_const_from(ira, &instruction->base); return ira->codegen->builtin_types.entry_void; } + static ZigType *ir_analyze_instruction_set_runtime_safety(IrAnalyze *ira, IrInstructionSetRuntimeSafety *set_runtime_safety_instruction) { @@ -15439,14 +15433,6 @@ static ZigType *ir_analyze_instruction_set_runtime_safety(IrAnalyze *ira, static ZigType *ir_analyze_instruction_set_float_mode(IrAnalyze *ira, IrInstructionSetFloatMode *instruction) { - IrInstruction *target_instruction = instruction->scope_value->other; - ZigType *target_type = target_instruction->value.type; - if (type_is_invalid(target_type)) - return ira->codegen->builtin_types.entry_invalid; - ConstExprValue *target_val = ir_resolve_const(ira, target_instruction, UndefBad); - if (!target_val) - return ira->codegen->builtin_types.entry_invalid; - if (ira->new_irb.exec->is_inline) { // ignore setFloatMode when running functions at compile time ir_build_const_from(ira, &instruction->base); @@ -15455,40 +15441,34 @@ static ZigType *ir_analyze_instruction_set_float_mode(IrAnalyze *ira, bool *fast_math_on_ptr; AstNode **fast_math_set_node_ptr; - if (target_type->id == ZigTypeIdBlock) { - ScopeBlock *block_scope = (ScopeBlock *)target_val->data.x_block; - fast_math_on_ptr = &block_scope->fast_math_on; - fast_math_set_node_ptr = &block_scope->fast_math_set_node; - } else if (target_type->id == ZigTypeIdFn) { - assert(target_val->data.x_ptr.special == ConstPtrSpecialFunction); - ZigFn *target_fn = target_val->data.x_ptr.data.fn.fn_entry; - assert(target_fn->def_scope); - fast_math_on_ptr = &target_fn->def_scope->fast_math_on; - fast_math_set_node_ptr = &target_fn->def_scope->fast_math_set_node; - } else if (target_type->id == ZigTypeIdMetaType) { - ScopeDecls *decls_scope; - ZigType *type_arg = target_val->data.x_type; - if (type_arg->id == ZigTypeIdStruct) { - decls_scope = type_arg->data.structure.decls_scope; - } else if (type_arg->id == ZigTypeIdEnum) { - decls_scope = type_arg->data.enumeration.decls_scope; - } else if (type_arg->id == ZigTypeIdUnion) { - decls_scope = type_arg->data.unionation.decls_scope; + + Scope *scope = instruction->base.scope; + while (scope != nullptr) { + if (scope->id == ScopeIdBlock) { + ScopeBlock *block_scope = (ScopeBlock *)scope; + fast_math_on_ptr = &block_scope->fast_math_on; + fast_math_set_node_ptr = &block_scope->fast_math_set_node; + break; + } else if (scope->id == ScopeIdFnDef) { + ScopeFnDef *def_scope = (ScopeFnDef *)scope; + ZigFn *target_fn = def_scope->fn_entry; + assert(target_fn->def_scope != nullptr); + fast_math_on_ptr = &target_fn->def_scope->fast_math_on; + fast_math_set_node_ptr = &target_fn->def_scope->fast_math_set_node; + break; + } else if (scope->id == ScopeIdDecls) { + ScopeDecls *decls_scope = (ScopeDecls *)scope; + fast_math_on_ptr = &decls_scope->fast_math_on; + fast_math_set_node_ptr = &decls_scope->fast_math_set_node; + break; } else { - ir_add_error_node(ira, target_instruction->source_node, - buf_sprintf("expected scope reference, found type '%s'", buf_ptr(&type_arg->name))); - return ira->codegen->builtin_types.entry_invalid; + scope = scope->parent; + continue; } - fast_math_on_ptr = &decls_scope->fast_math_on; - fast_math_set_node_ptr = &decls_scope->fast_math_set_node; - } else { - ir_add_error_node(ira, target_instruction->source_node, - buf_sprintf("expected scope reference, found type '%s'", buf_ptr(&target_type->name))); - return ira->codegen->builtin_types.entry_invalid; } + assert(scope != nullptr); IrInstruction *float_mode_value = instruction->mode_value->other; - FloatMode float_mode_scalar; if (!ir_resolve_float_mode(ira, float_mode_value, &float_mode_scalar)) return ira->codegen->builtin_types.entry_invalid; diff --git a/test/cases/eval.zig b/test/cases/eval.zig index b8d80bda02..4286821183 100644 --- a/test/cases/eval.zig +++ b/test/cases/eval.zig @@ -275,7 +275,7 @@ test "eval @setFloatMode at compile-time" { } fn fnWithFloatMode() f32 { - @setFloatMode(this, builtin.FloatMode.Strict); + @setFloatMode(builtin.FloatMode.Strict); return 1234.0; } diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 8fb64e21e2..750794c909 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -3996,8 +3996,8 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { cases.add( "@setFloatMode twice for same scope", \\export fn foo() void { - \\ @setFloatMode(this, @import("builtin").FloatMode.Optimized); - \\ @setFloatMode(this, @import("builtin").FloatMode.Optimized); + \\ @setFloatMode(@import("builtin").FloatMode.Optimized); + \\ @setFloatMode(@import("builtin").FloatMode.Optimized); \\} , ".tmp_source.zig:3:5: error: float mode set twice for same scope",