diff --git a/releasenotes.md b/releasenotes.md index 2ac8d53d9..589a95008 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -30,6 +30,7 @@ - Enum associated values can reference the calling enum. - Improve error message on `foo ?? io::EOF` with missing '?' #2036 - Make `@public` import recursive. #2018 +- Fault nameof prefixes the first last module path, for instance `std::io::EOF` is rendered as `io::EOF`. ### Fixes - Fix address sanitizer to work on MachO targets (e.g. MacOS). diff --git a/src/compiler/llvm_codegen.c b/src/compiler/llvm_codegen.c index 42f6a45e1..97516de41 100644 --- a/src/compiler/llvm_codegen.c +++ b/src/compiler/llvm_codegen.c @@ -1276,7 +1276,26 @@ static LLVMValueRef llvm_create_fault(GenContext *c, Decl *decl) LLVMValueRef fault = llvm_add_global_raw(c, scratch_buffer_to_string(), c->chars_type, 0); LLVMSetGlobalConstant(fault, 1); scratch_buffer_append(".nameof"); - LLVMSetInitializer(fault, llvm_emit_string_const(c, decl->name, scratch_buffer_to_string())); + if (decl->obfuscate) + { + LLVMSetInitializer(fault, llvm_emit_string_const(c, "", scratch_buffer_to_string())); + } + else + { + const char *module_name = decl->unit->module->name->module; + size_t last = 0; + for (size_t i = 0;; i++) + { + if (module_name[i] == 0) break; + if (module_name[i] == ':') + { + i++; + last = i + 1; + } + } + const char *new_name = str_printf("%s::%s", &module_name[last], decl->name); + LLVMSetInitializer(fault, llvm_emit_string_const(c, new_name, scratch_buffer_to_string())); + } llvm_set_linkonce(c, fault); decl->backend_ref = fault; return fault; diff --git a/test/test_suite/errors/optional_taddr_and_access.c3t b/test/test_suite/errors/optional_taddr_and_access.c3t index 24fc647bd..397da6838 100644 --- a/test/test_suite/errors/optional_taddr_and_access.c3t +++ b/test/test_suite/errors/optional_taddr_and_access.c3t @@ -26,8 +26,8 @@ fn void main() @"$ct.test.Foo" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 -@test.FOO = linkonce constant %"char[]" { ptr @test.FOO.nameof, i64 3 }, align 8 -@test.FOO.nameof = internal constant [4 x i8] c"FOO\00", align 1 +@test.FOO = linkonce constant %"char[]" { ptr @test.FOO.nameof, i64 9 }, align 8 +@test.FOO.nameof = internal constant [10 x i8] c"test::FOO\00", align 1 @.str.1 = private unnamed_addr constant [17 x i8] c"Not visible: %d\0A\00", align 1 ; Function Attrs: diff --git a/test/test_suite/globals/init_with_err.c3t b/test/test_suite/globals/init_with_err.c3t index 823e02d6b..ef108bf95 100644 --- a/test/test_suite/globals/init_with_err.c3t +++ b/test/test_suite/globals/init_with_err.c3t @@ -16,8 +16,8 @@ String? bcd = ABC; @test.DEF.f = unnamed_addr global i64 ptrtoint (ptr @test.FOO to i64), align 8 @test.bcd.f = unnamed_addr global i64 ptrtoint (ptr @test.FOO to i64), align 8 @test.ABC = local_unnamed_addr constant %"char[]" zeroinitializer, align 8 -@test.FOO = linkonce constant %"char[]" { ptr @test.FOO.nameof, i64 3 }, align 8 -@test.FOO.nameof = internal constant [4 x i8] c"FOO\00", align 1 +@test.FOO = linkonce constant %"char[]" { ptr @test.FOO.nameof, i64 9 }, align 8 +@test.FOO.nameof = internal constant [10 x i8] c"test::FOO\00", align 1 @test.abc = local_unnamed_addr global %"char[]" zeroinitializer, align 8 @test.DEF = local_unnamed_addr constant %"char[]" zeroinitializer, align 8 @test.bcd = local_unnamed_addr global %"char[]" zeroinitializer, align 8