Hahnfeld created this revision. Hahnfeld added reviewers: erichkeane, aaron.ballman. Herald added a project: All. Hahnfeld requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
These new functions allow to look at specializations without triggering deserialization, which might be problematic in some contexts. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D154328 Files: clang/include/clang/AST/DeclTemplate.h Index: clang/include/clang/AST/DeclTemplate.h =================================================================== --- clang/include/clang/AST/DeclTemplate.h +++ clang/include/clang/AST/DeclTemplate.h @@ -1114,6 +1114,20 @@ return makeSpecIterator(getSpecializations(), true); } + /// All specializations that that have already been loaded, ie avoiding + /// deserialization of lazily registered specializations. + spec_range loaded_specializations() const { + return spec_range(loaded_spec_begin(), loaded_spec_end()); + } + + spec_iterator loaded_spec_begin() const { + return makeSpecIterator(getCommonPtr()->Specializations, false); + } + + spec_iterator loaded_spec_end() const { + return makeSpecIterator(getCommonPtr()->Specializations, true); + } + /// Return whether this function template is an abbreviated function template, /// e.g. `void foo(auto x)` or `template<typename T> void foo(auto x)` bool isAbbreviated() const { @@ -2454,6 +2468,20 @@ return makeSpecIterator(getSpecializations(), true); } + /// All specializations that that have already been loaded, ie avoiding + /// deserialization of lazily registered specializations. + spec_range loaded_specializations() const { + return spec_range(loaded_spec_begin(), loaded_spec_end()); + } + + spec_iterator loaded_spec_begin() const { + return makeSpecIterator(getCommonPtr()->Specializations, false); + } + + spec_iterator loaded_spec_end() const { + return makeSpecIterator(getCommonPtr()->Specializations, true); + } + // Implement isa/cast/dyncast support static bool classof(const Decl *D) { return classofKind(D->getKind()); } static bool classofKind(Kind K) { return K == ClassTemplate; } @@ -3262,6 +3290,20 @@ return makeSpecIterator(getSpecializations(), true); } + /// All specializations that that have already been loaded, ie avoiding + /// deserialization of lazily registered specializations. + spec_range loaded_specializations() const { + return spec_range(loaded_spec_begin(), loaded_spec_end()); + } + + spec_iterator loaded_spec_begin() const { + return makeSpecIterator(getCommonPtr()->Specializations, false); + } + + spec_iterator loaded_spec_end() const { + return makeSpecIterator(getCommonPtr()->Specializations, true); + } + // Implement isa/cast/dyncast support static bool classof(const Decl *D) { return classofKind(D->getKind()); } static bool classofKind(Kind K) { return K == VarTemplate; }
Index: clang/include/clang/AST/DeclTemplate.h =================================================================== --- clang/include/clang/AST/DeclTemplate.h +++ clang/include/clang/AST/DeclTemplate.h @@ -1114,6 +1114,20 @@ return makeSpecIterator(getSpecializations(), true); } + /// All specializations that that have already been loaded, ie avoiding + /// deserialization of lazily registered specializations. + spec_range loaded_specializations() const { + return spec_range(loaded_spec_begin(), loaded_spec_end()); + } + + spec_iterator loaded_spec_begin() const { + return makeSpecIterator(getCommonPtr()->Specializations, false); + } + + spec_iterator loaded_spec_end() const { + return makeSpecIterator(getCommonPtr()->Specializations, true); + } + /// Return whether this function template is an abbreviated function template, /// e.g. `void foo(auto x)` or `template<typename T> void foo(auto x)` bool isAbbreviated() const { @@ -2454,6 +2468,20 @@ return makeSpecIterator(getSpecializations(), true); } + /// All specializations that that have already been loaded, ie avoiding + /// deserialization of lazily registered specializations. + spec_range loaded_specializations() const { + return spec_range(loaded_spec_begin(), loaded_spec_end()); + } + + spec_iterator loaded_spec_begin() const { + return makeSpecIterator(getCommonPtr()->Specializations, false); + } + + spec_iterator loaded_spec_end() const { + return makeSpecIterator(getCommonPtr()->Specializations, true); + } + // Implement isa/cast/dyncast support static bool classof(const Decl *D) { return classofKind(D->getKind()); } static bool classofKind(Kind K) { return K == ClassTemplate; } @@ -3262,6 +3290,20 @@ return makeSpecIterator(getSpecializations(), true); } + /// All specializations that that have already been loaded, ie avoiding + /// deserialization of lazily registered specializations. + spec_range loaded_specializations() const { + return spec_range(loaded_spec_begin(), loaded_spec_end()); + } + + spec_iterator loaded_spec_begin() const { + return makeSpecIterator(getCommonPtr()->Specializations, false); + } + + spec_iterator loaded_spec_end() const { + return makeSpecIterator(getCommonPtr()->Specializations, true); + } + // Implement isa/cast/dyncast support static bool classof(const Decl *D) { return classofKind(D->getKind()); } static bool classofKind(Kind K) { return K == VarTemplate; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits