fix #20686 infer attributes for generated functions

This commit is contained in:
Walter Bright 2025-01-10 23:30:02 -08:00 committed by Nicholas Wilson
parent aa56a318eb
commit 10eb368c1b
3 changed files with 29 additions and 3 deletions

View file

@ -269,7 +269,7 @@ FuncDeclaration buildOpAssign(StructDeclaration sd, Scope* sc)
return null; return null;
//printf("StructDeclaration::buildOpAssign() %s\n", sd.toChars()); //printf("StructDeclaration::buildOpAssign() %s\n", sd.toChars());
StorageClass stc = STC.safe | STC.nothrow_ | STC.pure_ | STC.nogc; StorageClass stc = STC.safe;
Loc declLoc = sd.loc; Loc declLoc = sd.loc;
Loc loc; // internal code should have no loc to prevent coverage Loc loc; // internal code should have no loc to prevent coverage
@ -1278,7 +1278,7 @@ FuncDeclaration buildPostBlit(StructDeclaration sd, Scope* sc)
const hasUserDefinedPosblit = sd.postblits.length && !sd.postblits[0].isDisabled ? true : false; const hasUserDefinedPosblit = sd.postblits.length && !sd.postblits[0].isDisabled ? true : false;
// by default, the storage class of the created postblit // by default, the storage class of the created postblit
StorageClass stc = STC.safe | STC.nothrow_ | STC.pure_ | STC.nogc; StorageClass stc = STC.safe;
Loc declLoc = sd.postblits.length ? sd.postblits[0].loc : sd.loc; Loc declLoc = sd.postblits.length ? sd.postblits[0].loc : sd.loc;
Loc loc; // internal code should have no loc to prevent coverage Loc loc; // internal code should have no loc to prevent coverage
@ -1380,6 +1380,7 @@ FuncDeclaration buildPostBlit(StructDeclaration sd, Scope* sc)
// perform semantic on the member postblit in order to // perform semantic on the member postblit in order to
// be able to aggregate it later on with the rest of the // be able to aggregate it later on with the rest of the
// postblits // postblits
sdv.postblit.isGenerated = true;
functionSemantic(sdv.postblit); functionSemantic(sdv.postblit);
stc = mergeFuncAttrs(stc, sdv.postblit); stc = mergeFuncAttrs(stc, sdv.postblit);
@ -1445,6 +1446,7 @@ FuncDeclaration buildPostBlit(StructDeclaration sd, Scope* sc)
*/ */
if (sdv.dtor) if (sdv.dtor)
{ {
sdv.dtor.isGenerated = true;
functionSemantic(sdv.dtor); functionSemantic(sdv.dtor);
// keep a list of fields that need to be destroyed in case // keep a list of fields that need to be destroyed in case

View file

@ -666,6 +666,8 @@ extern (C++) class C18890_2
Agg s; Agg s;
} }
void test18890()
{
version (CppMangle_Itanium) version (CppMangle_Itanium)
{ {
static assert(C18890.__dtor.mangleof == "_ZN6C18890D1Ev"); static assert(C18890.__dtor.mangleof == "_ZN6C18890D1Ev");
@ -690,6 +692,7 @@ version (CppMangle_MSVC)
static assert(C18890_2.__xdtor.mangleof == "??_GC18890_2@@UEAAPEAXI@Z"); static assert(C18890_2.__xdtor.mangleof == "??_GC18890_2@@UEAAPEAXI@Z");
} }
} }
}
/**************************************/ /**************************************/
// https://issues.dlang.org/show_bug.cgi?id=18891 // https://issues.dlang.org/show_bug.cgi?id=18891
@ -704,6 +707,8 @@ extern (C++) class C18891
Agg s; Agg s;
} }
void test18891()
{
version (CppMangle_Itanium) version (CppMangle_Itanium)
{ {
static assert(C18891.__dtor.mangleof == "_ZN6C18891D1Ev"); static assert(C18891.__dtor.mangleof == "_ZN6C18891D1Ev");
@ -722,6 +727,7 @@ version (CppMangle_MSVC)
static assert(C18891.__xdtor.mangleof == "??_GC18891@@UEAAPEAXI@Z"); static assert(C18891.__xdtor.mangleof == "??_GC18891@@UEAAPEAXI@Z");
} }
} }
}
/**************************************/ /**************************************/
// Test C++ operator mangling // Test C++ operator mangling

View file

@ -817,4 +817,22 @@ void test13840() nothrow
{} {}
} }
// Add more tests regarding inferences later. /***************************************************/
// https://github.com/dlang/dmd/pull/20685
struct T1
{
int a;
inout this(ref inout T1 t) @nogc nothrow pure { a = t.a; }
}
struct S1
{
T1 t; // generate copy constructor, infer @nogc nothrow pure
}
void test1() @nogc nothrow pure
{
S1 s;
S1 t = s;
}