Move ClassDeclaration.isFuncHidden to dsymbolsem (#20945)

This commit is contained in:
Matthew Qiu 2025-03-05 03:18:53 -05:00 committed by GitHub
parent bc4c7e4452
commit 6df52b0ef2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 47 additions and 39 deletions

View file

@ -46,6 +46,7 @@ namespace dmd
FuncDeclaration *search_toString(StructDeclaration *sd);
void semanticTypeInfoMembers(StructDeclaration *sd);
bool fill(StructDeclaration* sd, Loc loc, Expressions &elements, bool ctorinit);
bool isFuncHidden(ClassDeclaration* cd, FuncDeclaration* fd);
}
enum class ClassKind : uint8_t
@ -287,7 +288,6 @@ public:
bool isBaseInfoComplete();
void finalizeSize() override;
bool hasMonitor();
bool isFuncHidden(FuncDeclaration *fd);
bool isCOMclass() const;
virtual bool isCOMinterface() const;
bool isCPPclass() const;

View file

@ -15,6 +15,7 @@ import dmd.arraytypes;
import dmd.astenums;
import dmd.attrib;
import dmd.common.outbuffer : OutBuffer;
import dmd.dclass : ClassDeclaration;
import dmd.denum : EnumDeclaration;
import dmd.dmodule /*: Module*/;
import dmd.dscope : Scope;
@ -178,6 +179,12 @@ Dsymbols* include(Dsymbol d, Scope* sc)
return dmd.dsymbolsem.include(d, sc);
}
bool isFuncHidden(ClassDeclaration cd, FuncDeclaration fd)
{
import dmd.dsymbolsem;
return dmd.dsymbolsem.isFuncHidden(cd, fd);
}
/***********************************************************
* dtemplate.d
*/

View file

@ -23,7 +23,7 @@ import dmd.gluelayer;
import dmd.declaration;
import dmd.dscope;
import dmd.dsymbol;
import dmd.dsymbolsem : dsymbolSemantic, addMember, search, setFieldOffset;
import dmd.dsymbolsem : dsymbolSemantic, addMember, setFieldOffset;
import dmd.errors;
import dmd.func;
import dmd.id;
@ -614,40 +614,6 @@ extern (C++) class ClassDeclaration : AggregateDeclaration
return classKind == ClassKind.d;
}
final bool isFuncHidden(FuncDeclaration fd)
{
import dmd.funcsem : overloadApply;
//printf("ClassDeclaration.isFuncHidden(class = %s, fd = %s)\n", toChars(), fd.toPrettyChars());
Dsymbol s = this.search(Loc.initial, fd.ident, SearchOpt.ignoreAmbiguous | SearchOpt.ignoreErrors);
if (!s)
{
//printf("not found\n");
/* Because, due to a hack, if there are multiple definitions
* of fd.ident, NULL is returned.
*/
return false;
}
s = s.toAlias();
if (auto os = s.isOverloadSet())
{
foreach (sm; os.a)
{
auto fm = sm.isFuncDeclaration();
if (overloadApply(fm, s => fd == s.isFuncDeclaration()))
return false;
}
return true;
}
else
{
auto f = s.isFuncDeclaration();
//printf("%s fdstart = %p\n", s.kind(), fdstart);
if (overloadApply(f, s => fd == s.isFuncDeclaration()))
return false;
return !fd.parent.isTemplateMixin();
}
}
/****************
* Find virtual function matching identifier and type.
* Used to build virtual function tables for interface implementations.

View file

@ -8160,3 +8160,37 @@ private extern(C++) class HasStaticCtorOrDtor : Visitor
result = true;
}
}
extern(C++) bool isFuncHidden(ClassDeclaration cd, FuncDeclaration fd)
{
import dmd.funcsem : overloadApply;
//printf("ClassDeclaration.isFuncHidden(class = %s, fd = %s)\n", toChars(), fd.toPrettyChars());
Dsymbol s = cd.search(Loc.initial, fd.ident, SearchOpt.ignoreAmbiguous | SearchOpt.ignoreErrors);
if (!s)
{
//printf("not found\n");
/* Because, due to a hack, if there are multiple definitions
* of fd.ident, NULL is returned.
*/
return false;
}
s = s.toAlias();
if (auto os = s.isOverloadSet())
{
foreach (sm; os.a)
{
auto fm = sm.isFuncDeclaration();
if (overloadApply(fm, s => fd == s.isFuncDeclaration()))
return false;
}
return true;
}
else
{
auto f = s.isFuncDeclaration();
//printf("%s fdstart = %p\n", s.kind(), fdstart);
if (overloadApply(f, s => fd == s.isFuncDeclaration()))
return false;
return !fd.parent.isTemplateMixin();
}
}

View file

@ -6680,7 +6680,6 @@ public:
bool isBaseInfoComplete() const;
void finalizeSize() final override;
bool hasMonitor();
bool isFuncHidden(FuncDeclaration* fd);
bool isCOMclass() const;
virtual bool isCOMinterface() const;
bool isCPPclass() const;
@ -7546,6 +7545,8 @@ public:
extern bool hasStaticCtorOrDtor(Dsymbol* d);
extern bool isFuncHidden(ClassDeclaration* cd, FuncDeclaration* fd);
extern void lowerNonArrayAggregate(StaticForeach* sfe, Scope* sc);
class NrvoWalker final : public StatementRewriteWalker

View file

@ -35,7 +35,7 @@ import dmd.dmodule;
import dmd.dscope;
import dmd.dstruct;
import dmd.dsymbol;
import dmd.dsymbolsem : include, hasStaticCtorOrDtor;
import dmd.dsymbolsem : hasStaticCtorOrDtor, include, isFuncHidden;
import dmd.dtemplate;
import dmd.errors;
import dmd.errorsink;

View file

@ -1323,7 +1323,7 @@ public:
continue;
if (!dmd::functionSemantic(fd))
return;
if (!d->isFuncHidden(fd) || fd->isFuture())
if (!dmd::isFuncHidden(d, fd) || fd->isFuture())
continue;
for (size_t j = 1; j < d->vtbl.length; j++)
{