diff --git a/clang/include/clang/AST/ExternalASTSource.h b/clang/include/clang/AST/ExternalASTSource.h --- a/clang/include/clang/AST/ExternalASTSource.h +++ b/clang/include/clang/AST/ExternalASTSource.h @@ -66,9 +66,8 @@ /// whenever we might have added new redeclarations for existing decls. uint32_t CurrentGeneration = 0; - /// Whether this AST source also provides information for - /// semantic analysis. - bool SemaSource = false; + /// LLVM-style RTTI. + static char ID; public: ExternalASTSource() = default; @@ -325,6 +324,12 @@ virtual void getMemoryBufferSizes(MemoryBufferSizes &sizes) const; + /// LLVM-style RTTI. + /// \{ + virtual bool isA(const void *ClassID) const { return ClassID == &ID; } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } + /// \} + protected: static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, diff --git a/clang/include/clang/Sema/ExternalSemaSource.h b/clang/include/clang/Sema/ExternalSemaSource.h --- a/clang/include/clang/Sema/ExternalSemaSource.h +++ b/clang/include/clang/Sema/ExternalSemaSource.h @@ -50,10 +50,11 @@ /// external AST sources that also provide information for semantic /// analysis. class ExternalSemaSource : public ExternalASTSource { + /// LLVM-style RTTI. + static char ID; + public: - ExternalSemaSource() { - ExternalASTSource::SemaSource = true; - } + ExternalSemaSource() = default; ~ExternalSemaSource() override; @@ -222,10 +223,13 @@ return false; } - // isa/cast/dyn_cast support - static bool classof(const ExternalASTSource *Source) { - return Source->SemaSource; + /// LLVM-style RTTI. + /// \{ + bool isA(const void *ClassID) const override { + return ClassID == &ID || ExternalASTSource::isA(ClassID); } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } + /// \} }; } // end namespace clang diff --git a/clang/include/clang/Sema/MultiplexExternalSemaSource.h b/clang/include/clang/Sema/MultiplexExternalSemaSource.h --- a/clang/include/clang/Sema/MultiplexExternalSemaSource.h +++ b/clang/include/clang/Sema/MultiplexExternalSemaSource.h @@ -36,6 +36,8 @@ /// external AST sources that also provide information for semantic /// analysis. class MultiplexExternalSemaSource : public ExternalSemaSource { + /// LLVM-style RTTI. + static char ID; private: SmallVector Sources; // doesn't own them. @@ -352,9 +354,13 @@ bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc, QualType T) override; - // isa/cast/dyn_cast support - static bool classof(const MultiplexExternalSemaSource*) { return true; } - //static bool classof(const ExternalSemaSource*) { return true; } + /// LLVM-style RTTI. + /// \{ + bool isA(const void *ClassID) const override { + return ClassID == &ID || ExternalSemaSource::isA(ClassID); + } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } + /// \} }; } // end namespace clang diff --git a/clang/lib/AST/ExternalASTSource.cpp b/clang/lib/AST/ExternalASTSource.cpp --- a/clang/lib/AST/ExternalASTSource.cpp +++ b/clang/lib/AST/ExternalASTSource.cpp @@ -24,6 +24,8 @@ using namespace clang; +char ExternalASTSource::ID; + ExternalASTSource::~ExternalASTSource() = default; llvm::Optional diff --git a/clang/lib/Sema/MultiplexExternalSemaSource.cpp b/clang/lib/Sema/MultiplexExternalSemaSource.cpp --- a/clang/lib/Sema/MultiplexExternalSemaSource.cpp +++ b/clang/lib/Sema/MultiplexExternalSemaSource.cpp @@ -15,6 +15,8 @@ using namespace clang; +char MultiplexExternalSemaSource::ID; + ///Constructs a new multiplexing external sema source and appends the /// given element to it. /// diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1917,6 +1917,7 @@ // Pin this vtable to this file. ExternalSemaSource::~ExternalSemaSource() {} +char ExternalSemaSource::ID; void ExternalSemaSource::ReadMethodPool(Selector Sel) { } void ExternalSemaSource::updateOutOfDateSelector(Selector Sel) { }