Merge remote-tracking branch 'origin/dmd-rewrite-stable' into merge_stable

This commit is contained in:
Martin Kinkelin 2024-12-07 23:59:12 +01:00
commit 612546dcca
4 changed files with 37 additions and 5 deletions

View file

@ -5588,7 +5588,7 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
symtab = sds.symtab; symtab = sds.symtab;
} }
assert(symtab); assert(symtab);
Identifier id = Identifier.generateIdWithLoc(s, exp.loc); Identifier id = Identifier.generateIdWithLoc(s, exp.loc, cast(string) toDString(sc.parent.toPrettyChars()));
exp.fd.ident = id; exp.fd.ident = id;
if (exp.td) if (exp.td)
exp.td.ident = id; exp.td.ident = id;

View file

@ -211,11 +211,14 @@ nothrow:
* Params: * Params:
* prefix = first part of the identifier name. * prefix = first part of the identifier name.
* loc = source location to use in the identifier name. * loc = source location to use in the identifier name.
* parent = (optional) extra part to be used in uniqueness check,
* if (prefix1, loc1) == (prefix2, loc2), but
* parent1 != parent2, no new name will be generated.
* Returns: * Returns:
* Identifier (inside Identifier.idPool) with deterministic name based * Identifier (inside Identifier.idPool) with deterministic name based
* on the source location. * on the source location.
*/ */
extern (D) static Identifier generateIdWithLoc(string prefix, const ref Loc loc) extern (D) static Identifier generateIdWithLoc(string prefix, const ref Loc loc, string parent = "")
{ {
// generate `<prefix>_L<line>_C<col>` // generate `<prefix>_L<line>_C<col>`
OutBuffer idBuf; OutBuffer idBuf;
@ -234,14 +237,20 @@ nothrow:
* https://issues.dlang.org/show_bug.cgi?id=18880 * https://issues.dlang.org/show_bug.cgi?id=18880
* https://issues.dlang.org/show_bug.cgi?id=18868 * https://issues.dlang.org/show_bug.cgi?id=18868
* https://issues.dlang.org/show_bug.cgi?id=19058 * https://issues.dlang.org/show_bug.cgi?id=19058
*
* It is a bit trickier for lambdas/dgliterals: we want them to be unique per
* module/mixin + function/template instantiation context. So we use extra parent
* argument for that when dealing with lambdas. We could have added it to prefix
* directly, but that would unnecessary lengthen symbols names. See issue:
* https://issues.dlang.org/show_bug.cgi?id=23722
*/ */
static struct Key { Loc loc; string prefix; } static struct Key { Loc loc; string prefix; string parent; }
__gshared uint[Key] counters; __gshared uint[Key] counters;
static if (__traits(compiles, counters.update(Key.init, () => 0u, (ref uint a) => 0u))) static if (__traits(compiles, counters.update(Key.init, () => 0u, (ref uint a) => 0u)))
{ {
// 2.082+ // 2.082+
counters.update(Key(loc, prefix), counters.update(Key(loc, prefix, parent),
() => 1u, // insertion () => 1u, // insertion
(ref uint counter) // update (ref uint counter) // update
{ {
@ -253,7 +262,7 @@ nothrow:
} }
else else
{ {
const key = Key(loc, prefix); const key = Key(loc, prefix, parent);
if (auto pCounter = key in counters) if (auto pCounter = key in counters)
{ {
idBuf.writestring("_"); idBuf.writestring("_");

View file

@ -0,0 +1,13 @@
module imports.test23722_2b;
struct T(alias fun) { }
struct S(int i) {
auto t = T!(x => i)();
}
string g() {
S!0 s0;
S!1 s1;
return s1.t.init.mangleof;
}

View file

@ -0,0 +1,10 @@
// COMPILE_SEPARATELY:
// EXTRA_SOURCES: imports/test23722_2b.d
// https://issues.dlang.org/show_bug.cgi?id=23722
// Lambdas are mangled incorrectly when using multiple compilation units, resulting in incorrect code
import imports.test23722_2b;
void main() {
S!1 s1;
assert(s1.t.init.mangleof == g);
}