llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: Oleksandr Tarasiuk (a-tarasyuk) <details> <summary>Changes</summary> Reverts llvm/llvm-project#<!-- -->191268 --- Revert dependent friend support due to a crash in access checking https://github.com/llvm/llvm-project/issues/208290 --- Patch is 142.99 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/208302.diff 41 Files Affected: - (modified) clang-tools-extra/clang-doc/Serialize.cpp (+3) - (modified) clang/docs/ReleaseNotes.md (-1) - (modified) clang/include/clang/AST/ASTStructuralEquivalence.h (-2) - (modified) clang/include/clang/AST/DeclFriend.h (+101-24) - (modified) clang/include/clang/AST/DeclTemplate.h (+40-42) - (modified) clang/include/clang/AST/RecursiveASTVisitor.h (+6-10) - (modified) clang/include/clang/Basic/DeclNodes.td (+1-1) - (modified) clang/include/clang/Basic/DiagnosticGroups.td (+1) - (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+10-7) - (modified) clang/include/clang/Sema/Sema.h (-12) - (modified) clang/include/clang/Sema/Template.h (+1-10) - (modified) clang/include/clang/Sema/TemplateDeduction.h (+3-14) - (modified) clang/include/clang/Serialization/ASTBitCodes.h (-7) - (modified) clang/lib/AST/ASTImporter.cpp (+18-92) - (modified) clang/lib/AST/ASTStructuralEquivalence.cpp (+1-58) - (modified) clang/lib/AST/DeclFriend.cpp (+25-39) - (modified) clang/lib/AST/DeclPrinter.cpp (+12-24) - (modified) clang/lib/AST/DeclTemplate.cpp (+13-42) - (modified) clang/lib/AST/ODRHash.cpp (-15) - (modified) clang/lib/Sema/Sema.cpp (+2-3) - (modified) clang/lib/Sema/SemaAccess.cpp (+98-651) - (modified) clang/lib/Sema/SemaDeclCXX.cpp (+94-135) - (modified) clang/lib/Sema/SemaOverload.cpp (+8-16) - (modified) clang/lib/Sema/SemaTemplate.cpp (+7-3) - (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (-10) - (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+61-140) - (modified) clang/lib/Serialization/ASTReaderDecl.cpp (+13-17) - (modified) clang/lib/Serialization/ASTWriterDecl.cpp (+15-20) - (modified) clang/test/CXX/class.access/class.friend/p3-cxx0x.cpp (+2-2) - (modified) clang/test/CXX/drs/cwg18xx.cpp (+8-8) - (modified) clang/test/CXX/drs/cwg19xx.cpp (+6-5) - (modified) clang/test/CXX/drs/cwg28xx.cpp (+1-2) - (modified) clang/test/CXX/drs/cwg6xx.cpp (+8-11) - (modified) clang/test/CXX/temp/temp.decls/temp.friend/p5.cpp (+10-257) - (removed) clang/test/CXX/temp/temp.decls/temp.friend/p6.cpp (-27) - (modified) clang/test/Parser/cxx2c-variadic-friends.cpp (+4-2) - (modified) clang/test/SemaCXX/many-template-parameter-lists.cpp (+3-6) - (modified) clang/test/SemaTemplate/GH71595.cpp (+2-6) - (modified) clang/test/SemaTemplate/concepts-friends.cpp (-58) - (modified) clang/test/SemaTemplate/ctad.cpp (+10-14) - (modified) clang/test/SemaTemplate/friend-template.cpp (+5-29) ``````````diff diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index 5fa23416949c4..50118e0472075 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -1029,6 +1029,9 @@ void Serializer::parseFriends(RecordInfo &RI, const CXXRecordDecl *D) { llvm::SmallVector<FriendInfo, 4> LocalFriends; for (const FriendDecl *FD : D->friends()) { + if (FD->isUnsupportedFriend()) + continue; + FriendInfo F(InfoType::IT_friend, getUSRForDecl(FD)); const auto *ActualDecl = FD->getFriendDecl(); if (!ActualDecl) { diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index b49a9db3d5fca..0626c41774960 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -246,7 +246,6 @@ latest release, please see the [Clang Web Site](https://clang.llvm.org) or the - `__is_trivially_equality_comparable` no longer returns false for all enum types. (#GH132672) - `auto` parameters are now available in all C++ language modes as an extension. -- Clang now supports friend declarations with a dependent nested name specifier. (#GH104057) #### C++2d Feature Support diff --git a/clang/include/clang/AST/ASTStructuralEquivalence.h b/clang/include/clang/AST/ASTStructuralEquivalence.h index 89d7f8d6ba8ff..6f82de1ae136d 100644 --- a/clang/include/clang/AST/ASTStructuralEquivalence.h +++ b/clang/include/clang/AST/ASTStructuralEquivalence.h @@ -135,8 +135,6 @@ struct StructuralEquivalenceContext { /// \c VisitedDecls members) and can cause faulty equivalent results. bool IsEquivalent(Stmt *S1, Stmt *S2); - bool IsEquivalent(TemplateParameterList *TPL1, TemplateParameterList *TPL2); - /// Find the index of the given anonymous struct/union within its /// context. /// diff --git a/clang/include/clang/AST/DeclFriend.h b/clang/include/clang/AST/DeclFriend.h index c68028d22bd54..1f8c210263677 100644 --- a/clang/include/clang/AST/DeclFriend.h +++ b/clang/include/clang/AST/DeclFriend.h @@ -15,13 +15,20 @@ #define LLVM_CLANG_AST_DECLFRIEND_H #include "clang/AST/Decl.h" +#include "clang/AST/DeclBase.h" #include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclTemplate.h" +#include "clang/AST/ExternalASTSource.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/SourceLocation.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" +#include "llvm/Support/TrailingObjects.h" #include <cassert> +#include <iterator> namespace clang { @@ -42,7 +49,9 @@ class ASTContext; /// @endcode /// /// The semantic context of a friend decl is its declaring class. -class FriendDecl : public Decl { +class FriendDecl final + : public Decl, + private llvm::TrailingObjects<FriendDecl, TemplateParameterList *> { LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION(); public: @@ -52,28 +61,46 @@ class FriendDecl : public Decl { friend class CXXRecordDecl; friend class CXXRecordDecl::friend_iterator; - // Location of the '...', if present. - SourceLocation EllipsisLoc; - - SourceLocation FriendLoc; - -protected: // The declaration that's a friend of this class. FriendUnion Friend; + // A pointer to the next friend in the sequence. LazyDeclPtr NextFriend; - FriendDecl(Kind K, DeclContext *DC, SourceLocation L, FriendUnion Friend, - SourceLocation FriendL, SourceLocation EllipsisLoc = {}) - : Decl(K, DC, L), EllipsisLoc(EllipsisLoc), FriendLoc(FriendL), - Friend(Friend), NextFriend() {} + // Location of the 'friend' specifier. + SourceLocation FriendLoc; + + // Location of the '...', if present. + SourceLocation EllipsisLoc; + + /// True if this 'friend' declaration is unsupported. Eventually we + /// will support every possible friend declaration, but for now we + /// silently ignore some and set this flag to authorize all access. + LLVM_PREFERRED_TYPE(bool) + unsigned UnsupportedFriend : 1; + + // The number of "outer" template parameter lists in non-templatic + // (currently unsupported) friend type declarations, such as + // template <class T> friend class A<T>::B; + unsigned NumTPLists : 31; + + FriendDecl(DeclContext *DC, SourceLocation L, FriendUnion Friend, + SourceLocation FriendL, SourceLocation EllipsisLoc, + ArrayRef<TemplateParameterList *> FriendTypeTPLists) + : Decl(Decl::Friend, DC, L), Friend(Friend), FriendLoc(FriendL), + EllipsisLoc(EllipsisLoc), UnsupportedFriend(false), + NumTPLists(FriendTypeTPLists.size()) { + llvm::copy(FriendTypeTPLists, getTrailingObjects()); + } - FriendDecl(Kind K, EmptyShell Empty) : Decl(K, Empty) {} + FriendDecl(EmptyShell Empty, unsigned NumFriendTypeTPLists) + : Decl(Decl::Friend, Empty), UnsupportedFriend(false), + NumTPLists(NumFriendTypeTPLists) {} FriendDecl *getNextFriend() { - if (NextFriend.isOffset()) - return getNextFriendSlowCase(); - return cast_or_null<FriendDecl>(NextFriend.get(nullptr)); + if (!NextFriend.isOffset()) + return cast_or_null<FriendDecl>(NextFriend.get(nullptr)); + return getNextFriendSlowCase(); } FriendDecl *getNextFriendSlowCase(); @@ -82,11 +109,14 @@ class FriendDecl : public Decl { friend class ASTDeclReader; friend class ASTDeclWriter; friend class ASTNodeImporter; + friend TrailingObjects; - static FriendDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, - FriendUnion Friend_, SourceLocation FriendL, - SourceLocation EllipsisLoc = {}); - static FriendDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID); + static FriendDecl * + Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, + SourceLocation FriendL, SourceLocation EllipsisLoc = {}, + ArrayRef<TemplateParameterList *> FriendTypeTPLists = {}); + static FriendDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID, + unsigned FriendTypeNumTPLists); /// If this friend declaration names an (untemplated but possibly /// dependent) type, return the type; otherwise return null. This @@ -96,27 +126,74 @@ class FriendDecl : public Decl { return Friend.dyn_cast<TypeSourceInfo*>(); } + unsigned getFriendTypeNumTemplateParameterLists() const { + return NumTPLists; + } + + TemplateParameterList *getFriendTypeTemplateParameterList(unsigned N) const { + return getTrailingObjects(NumTPLists)[N]; + } + /// If this friend declaration doesn't name a type, return the inner /// declaration. NamedDecl *getFriendDecl() const { return Friend.dyn_cast<NamedDecl *>(); } + /// Retrieves the location of the 'friend' keyword. + SourceLocation getFriendLoc() const { + return FriendLoc; + } + /// Retrieves the location of the '...', if present. SourceLocation getEllipsisLoc() const { return EllipsisLoc; } - SourceLocation getFriendLoc() const { return FriendLoc; } + /// Retrieves the source range for the friend declaration. + SourceRange getSourceRange() const override LLVM_READONLY { + if (TypeSourceInfo *TInfo = getFriendType()) { + SourceLocation StartL = (NumTPLists == 0) + ? getFriendLoc() + : getTrailingObjects()[0]->getTemplateLoc(); + SourceLocation EndL = isPackExpansion() ? getEllipsisLoc() + : TInfo->getTypeLoc().getEndLoc(); + return SourceRange(StartL, EndL); + } + + if (isPackExpansion()) + return SourceRange(getFriendLoc(), getEllipsisLoc()); + + if (NamedDecl *ND = getFriendDecl()) { + if (const auto *FD = dyn_cast<FunctionDecl>(ND)) + return FD->getSourceRange(); + if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(ND)) + return FTD->getSourceRange(); + if (const auto *CTD = dyn_cast<ClassTemplateDecl>(ND)) + return CTD->getSourceRange(); + if (const auto *DD = dyn_cast<DeclaratorDecl>(ND)) { + if (DD->getOuterLocStart() != DD->getInnerLocStart()) + return DD->getSourceRange(); + } + return SourceRange(getFriendLoc(), ND->getEndLoc()); + } + + return SourceRange(getFriendLoc(), getLocation()); + } - SourceRange getSourceRange() const override LLVM_READONLY; + /// Determines if this friend kind is unsupported. + bool isUnsupportedFriend() const { + return UnsupportedFriend; + } + void setUnsupportedFriend(bool Unsupported) { + UnsupportedFriend = Unsupported; + } bool isPackExpansion() const { return EllipsisLoc.isValid(); } // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return classofKind(D->getKind()); } - static bool classofKind(Kind K) { - return K >= firstFriend && K <= lastFriend; - } + static bool classofKind(Kind K) { return K == Decl::Friend; } }; + /// An iterator over the friend declarations of a class. class CXXRecordDecl::friend_iterator { friend class CXXRecordDecl; diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index 95d5ab1b11bf2..4f5a4e1b7b8a6 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -19,7 +19,6 @@ #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclCXX.h" -#include "clang/AST/DeclFriend.h" #include "clang/AST/DeclarationName.h" #include "clang/AST/Redeclarable.h" #include "clang/AST/TemplateBase.h" @@ -2462,51 +2461,45 @@ class ClassTemplateDecl : public RedeclarableTemplateDecl { /// template \<typename U> friend class Foo<T>::Nested; // friend template /// }; /// \endcode -class FriendTemplateDecl final - : public FriendDecl, - private llvm::TrailingObjects<FriendTemplateDecl, - TemplateParameterList *> { - void anchor() override; +/// +/// \note This class is not currently in use. All of the above +/// will yield a FriendDecl, not a FriendTemplateDecl. +class FriendTemplateDecl : public Decl { + virtual void anchor(); + +public: + using FriendUnion = llvm::PointerUnion<NamedDecl *,TypeSourceInfo *>; private: - unsigned NumTPLists = 0; - TemplateName Template; + // The number of template parameters; always non-zero. + unsigned NumParams = 0; - FriendTemplateDecl(DeclContext *DC, SourceLocation Loc, FriendUnion Friend, - SourceLocation FriendLoc, SourceLocation EllipsisLoc, - ArrayRef<TemplateParameterList *> FriendTypeTPLists, - TemplateName Template = {}) - : FriendDecl(Decl::FriendTemplate, DC, Loc, Friend, FriendLoc, - EllipsisLoc), - NumTPLists(FriendTypeTPLists.size()), Template(Template) { - llvm::copy(FriendTypeTPLists, getTrailingObjects()); - } + // The parameter list. + TemplateParameterList **Params = nullptr; + + // The declaration that's a friend of this class. + FriendUnion Friend; + + // Location of the 'friend' specifier. + SourceLocation FriendLoc; - FriendTemplateDecl(EmptyShell Empty, unsigned NumFriendTypeTPLists) - : FriendDecl(Decl::FriendTemplate, Empty), - NumTPLists(NumFriendTypeTPLists) {} + FriendTemplateDecl(DeclContext *DC, SourceLocation Loc, + TemplateParameterList **Params, unsigned NumParams, + FriendUnion Friend, SourceLocation FriendLoc) + : Decl(Decl::FriendTemplate, DC, Loc), NumParams(NumParams), + Params(Params), Friend(Friend), FriendLoc(FriendLoc) {} + + FriendTemplateDecl(EmptyShell Empty) : Decl(Decl::FriendTemplate, Empty) {} public: friend class ASTDeclReader; - friend class ASTDeclWriter; - friend TrailingObjects; static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, - FriendUnion Friend, SourceLocation FriendLoc, - ArrayRef<TemplateParameterList *> FriendTypeTPLists = {}, - SourceLocation EllipsisLoc = {}); - - static FriendTemplateDecl * - Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, - TemplateName Template, SourceLocation FriendLoc, - ArrayRef<TemplateParameterList *> FriendTypeTPLists = {}, - SourceLocation EllipsisLoc = {}); - - static FriendTemplateDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID, - unsigned FriendTypeNumTPLists); + MutableArrayRef<TemplateParameterList *> Params, FriendUnion Friend, + SourceLocation FriendLoc); - SourceRange getSourceRange() const override LLVM_READONLY; + static FriendTemplateDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID); /// If this friend declaration names a templated type (or /// a dependent member type of a templated type), return that @@ -2519,16 +2512,21 @@ class FriendTemplateDecl final /// a member function of a templated type), return that type; /// otherwise return null. NamedDecl *getFriendDecl() const { - if (TemplateDecl *TD = Template.getAsTemplateDecl()) - return TD; - return Friend.dyn_cast<NamedDecl *>(); + return Friend.dyn_cast<NamedDecl*>(); } - TemplateName getFriendTemplateName() const { return Template; } + /// Retrieves the location of the 'friend' keyword. + SourceLocation getFriendLoc() const { + return FriendLoc; + } - ArrayRef<TemplateParameterList *> - getFriendTypeTemplateParameterLists() const { - return ArrayRef(getTrailingObjects(), NumTPLists); + TemplateParameterList *getTemplateParameterList(unsigned i) const { + assert(i <= NumParams); + return Params[i]; + } + + unsigned getNumTemplateParameters() const { + return NumParams; } // Implement isa/cast/dyncast/etc. diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 4552437d3db9a..b77443f1fa0ab 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1733,16 +1733,12 @@ DEF_TRAVERSE_DECL(FriendDecl, { }) DEF_TRAVERSE_DECL(FriendTemplateDecl, { - TemplateName Template = D->getFriendTemplateName(); - if (Template.isNull()) { - if (D->getFriendType()) - TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc())); - else - TRY_TO(TraverseDecl(D->getFriendDecl())); - } else { - TRY_TO(TraverseTemplateName(Template)); - } - for (TemplateParameterList *TPL : D->getFriendTypeTemplateParameterLists()) { + if (D->getFriendType()) + TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc())); + else + TRY_TO(TraverseDecl(D->getFriendDecl())); + for (unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) { + TemplateParameterList *TPL = D->getTemplateParameterList(I); for (TemplateParameterList::iterator ITPL = TPL->begin(), ETPL = TPL->end(); ITPL != ETPL; ++ITPL) { TRY_TO(TraverseDecl(*ITPL)); diff --git a/clang/include/clang/Basic/DeclNodes.td b/clang/include/clang/Basic/DeclNodes.td index c55a3d68184f4..ffb58b43812dc 100644 --- a/clang/include/clang/Basic/DeclNodes.td +++ b/clang/include/clang/Basic/DeclNodes.td @@ -99,7 +99,7 @@ def FileScopeAsm : DeclNode<Decl>; def TopLevelStmt : DeclNode<Decl>, DeclContext; def AccessSpec : DeclNode<Decl>; def Friend : DeclNode<Decl>; -def FriendTemplate : DeclNode<Friend>; +def FriendTemplate : DeclNode<Decl>; def StaticAssert : DeclNode<Decl>; def ExplicitInstantiation : DeclNode<Decl>; def Block : DeclNode<Decl, "blocks">, DeclContext; diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index d353a86f228ba..79583534b9bbd 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -1198,6 +1198,7 @@ def Attributes : DiagGroup<"attributes", [UnknownAttributes, def UnknownSanitizers : DiagGroup<"unknown-sanitizers">; def UnnamedTypeTemplateArgs : DiagGroup<"unnamed-type-template-args", [CXX98CompatUnnamedTypeTemplateArgs]>; +def UnsupportedFriend : DiagGroup<"unsupported-friend">; def UnusedArgument : DiagGroup<"unused-argument">; def UnusedCommandLineArgument : DiagGroup<"unused-command-line-argument">; def IgnoredOptimizationArgument : DiagGroup<"ignored-optimization-argument">; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 3fa5bce9fb04f..38d9e4046d3a5 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1916,6 +1916,16 @@ def err_friend_not_first_in_declaration : Error< "'friend' must appear first in a non-function declaration">; def err_using_decl_friend : Error< "cannot befriend target of using declaration">; +def warn_template_qualified_friend_unsupported + : Warning< + "dependent nested name specifier %0 for friend class declaration is " + "not supported; turning off access control for %1">, + InGroup<UnsupportedFriend>; +def warn_template_qualified_friend_ignored + : Warning<"dependent nested name specifier %0 for friend template " + "declaration is " + "not supported; ignoring this friend declaration">, + InGroup<UnsupportedFriend>; def ext_friend_tag_redecl_outside_namespace : ExtWarn< "unqualified friend declaration referring to type outside of the nearest " "enclosing namespace is a Microsoft extension; add a nested name specifier">, @@ -1925,8 +1935,6 @@ def err_friend_template_decl_multiple_specifiers: Error< "a friend declaration that befriends a template must contain exactly one type-specifier">; def friend_template_decl_malformed_pack_expansion : Error< "friend declaration expands pack %0 that is declared it its own template parameter list">; -def err_dependent_friend_not_member : Error< - "friend declaration does not name a member of a class template specialization">; def err_invalid_base_in_interface : Error< "interface type cannot inherit from " @@ -5282,16 +5290,11 @@ def note_ovl_candidate_deduced_mismatch : Note< "adjusted type of %select{|element of }4argument}1,2%3">; def note_ovl_candidate_non_deduced_mismatch : Note< "candidate template ignored: could not match %diff{$ against $|types}0,1">; -def note_friend_template_non_deduced_mismatch : Note< - "candidate friend template ignored: could not match " - "%diff{$ against $|types}0,1">; // This note is needed because the above note would sometimes print two // different types with the same name. Remove this note when the above note // can handle that case properly. def note_ovl_candidate_non_deduced_mismatch_qualified : Note< "candidate template ignored: could not match %q0 against %q1">; -def note_friend_template_non_deduced_mismatch_qualified : Note< - "candidate friend template ignored: could not match %q0 against %q1">; // Note that we don't treat templates differently for this diagnostic. def note_ovl_candidate_arity : Note<"candidate " diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index e658f57968b99..f7d0d493e7081 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -12018,9 +12018,6 @@ class Sema final : public SemaBase { bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous); void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous); - bool CheckDependentFriend(SourceLocation Loc, NestedNameSpecifier NNS, - TemplateParameterList *FPL); - // Explicit instantiation of a class template specialization DeclResult ActOnExplicitInstantiation( Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc, @@ -12754,15 +12751,6 @@ class Sema final : public SemaBase { return false; }); - /// Finish template argument deduction for a template declaration, checking - /// the deduced template arguments for completeness and forming the deduced - /// template argument list. - TemplateDeductionResult FinishTemplateArgumentDeduction( - TemplateDecl *TD, TemplateParameterList *TPL, - ArrayRef<TemplateArgument> PatternArgs, ArrayRef<TemplateArgument> Args, - ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/208302 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
