diff --git a/compiler/src/dmd/aggregate.h b/compiler/src/dmd/aggregate.h index d3aad56877..4dedd945be 100644 --- a/compiler/src/dmd/aggregate.h +++ b/compiler/src/dmd/aggregate.h @@ -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; diff --git a/compiler/src/dmd/cxxfrontend.d b/compiler/src/dmd/cxxfrontend.d index 6ba7545193..7f1a7424b1 100644 --- a/compiler/src/dmd/cxxfrontend.d +++ b/compiler/src/dmd/cxxfrontend.d @@ -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 */ diff --git a/compiler/src/dmd/dclass.d b/compiler/src/dmd/dclass.d index 12e815533c..d3732223e3 100644 --- a/compiler/src/dmd/dclass.d +++ b/compiler/src/dmd/dclass.d @@ -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. diff --git a/compiler/src/dmd/dsymbolsem.d b/compiler/src/dmd/dsymbolsem.d index c401601166..63b9e693d0 100644 --- a/compiler/src/dmd/dsymbolsem.d +++ b/compiler/src/dmd/dsymbolsem.d @@ -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(); + } +} diff --git a/compiler/src/dmd/frontend.h b/compiler/src/dmd/frontend.h index 6fa7f01249..f7a25afbc9 100644 --- a/compiler/src/dmd/frontend.h +++ b/compiler/src/dmd/frontend.h @@ -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 diff --git a/compiler/src/dmd/toobj.d b/compiler/src/dmd/toobj.d index 28ed2ea0f3..872970e03d 100644 --- a/compiler/src/dmd/toobj.d +++ b/compiler/src/dmd/toobj.d @@ -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; diff --git a/compiler/src/tests/cxxfrontend.cc b/compiler/src/tests/cxxfrontend.cc index ca92758f53..7dd769952c 100644 --- a/compiler/src/tests/cxxfrontend.cc +++ b/compiler/src/tests/cxxfrontend.cc @@ -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++) {