diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 05dec109828d..b48f7e4f9308 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -465,6 +465,10 @@ public: ASTContext &getASTContext() const LLVM_READONLY; + /// Helper to get the language options from the ASTContext. + /// Defined out of line to avoid depending on ASTContext.h. + const LangOptions &getLangOpts() const LLVM_READONLY; + void setAccess(AccessSpecifier AS) { Access = AS; assert(AccessDeclContextSanity()); diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index 60d99f1a487f..d914bd10663e 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -15,7 +15,6 @@ #ifndef LLVM_CLANG_AST_DECLCXX_H #define LLVM_CLANG_AST_DECLCXX_H -#include "clang/AST/ASTContext.h" #include "clang/AST/ASTUnresolvedSet.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" @@ -40,6 +39,7 @@ #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/TinyPtrVector.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" @@ -53,6 +53,7 @@ namespace clang { +class ASTContext; class ClassTemplateDecl; class ConstructorUsingShadowDecl; class CXXBasePath; @@ -1166,7 +1167,7 @@ public: bool defaultedDefaultConstructorIsConstexpr() const { return data().DefaultedDefaultConstructorIsConstexpr && (!isUnion() || hasInClassInitializer() || !hasVariantMembers() || - getASTContext().getLangOpts().CPlusPlus2a); + getLangOpts().CPlusPlus2a); } /// Determine whether this class has a constexpr default constructor. @@ -1258,7 +1259,7 @@ public: /// would be constexpr. bool defaultedDestructorIsConstexpr() const { return data().DefaultedDestructorIsConstexpr && - getASTContext().getLangOpts().CPlusPlus2a; + getLangOpts().CPlusPlus2a; } /// Determine whether this class has a constexpr destructor. @@ -1355,10 +1356,10 @@ public: /// /// Only in C++17 and beyond, are lambdas literal types. bool isLiteral() const { - ASTContext &Ctx = getASTContext(); - return (Ctx.getLangOpts().CPlusPlus2a ? hasConstexprDestructor() + const LangOptions &LangOpts = getLangOpts(); + return (LangOpts.CPlusPlus2a ? hasConstexprDestructor() : hasTrivialDestructor()) && - (!isLambda() || Ctx.getLangOpts().CPlusPlus17) && + (!isLambda() || LangOpts.CPlusPlus17) && !hasNonLiteralTypeFieldsOrBases() && (isAggregate() || isLambda() || hasConstexprNonCopyMoveConstructor() || @@ -2035,7 +2036,8 @@ public: method_iterator end_overridden_methods() const; unsigned size_overridden_methods() const; - using overridden_method_range= ASTContext::overridden_method_range; + using overridden_method_range = llvm::iterator_range< + llvm::TinyPtrVector::const_iterator>; overridden_method_range overridden_methods() const; diff --git a/clang/include/clang/AST/GlobalDecl.h b/clang/include/clang/AST/GlobalDecl.h index bf30d9b94235..d8ac498be54f 100644 --- a/clang/include/clang/AST/GlobalDecl.h +++ b/clang/include/clang/AST/GlobalDecl.h @@ -150,9 +150,8 @@ public: } static KernelReferenceKind getDefaultKernelReference(const FunctionDecl *D) { - return D->getASTContext().getLangOpts().CUDAIsDevice - ? KernelReferenceKind::Kernel - : KernelReferenceKind::Stub; + return D->getLangOpts().CUDAIsDevice ? KernelReferenceKind::Kernel + : KernelReferenceKind::Stub; } GlobalDecl getWithDecl(const Decl *D) { diff --git a/clang/include/clang/Serialization/ASTRecordReader.h b/clang/include/clang/Serialization/ASTRecordReader.h index 5bdc9ca2ddbf..52de383b0ebf 100644 --- a/clang/include/clang/Serialization/ASTRecordReader.h +++ b/clang/include/clang/Serialization/ASTRecordReader.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H #define LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H +#include "clang/AST/ASTContext.h" #include "clang/AST/AbstractBasicReader.h" #include "clang/Lex/Token.h" #include "clang/Serialization/ASTReader.h" diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp index 8102f0115cc7..7642e73fa171 100644 --- a/clang/lib/AST/CommentSema.cpp +++ b/clang/lib/AST/CommentSema.cpp @@ -691,7 +691,7 @@ void Sema::checkDeprecatedCommand(const BlockCommandComment *Command) { FD->doesThisDeclarationHaveABody()) return; - const LangOptions &LO = FD->getASTContext().getLangOpts(); + const LangOptions &LO = FD->getLangOpts(); const bool DoubleSquareBracket = LO.CPlusPlus14 || LO.C2x; StringRef AttributeSpelling = DoubleSquareBracket ? "[[deprecated]]" : "__attribute__((deprecated))"; diff --git a/clang/lib/AST/ComparisonCategories.cpp b/clang/lib/AST/ComparisonCategories.cpp index 07673230357f..6b6826c02a12 100644 --- a/clang/lib/AST/ComparisonCategories.cpp +++ b/clang/lib/AST/ComparisonCategories.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/AST/ComparisonCategories.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/Type.h" diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index a59873cbc9fc..0eb88e07f9bc 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -378,6 +378,12 @@ ASTContext &Decl::getASTContext() const { return getTranslationUnitDecl()->getASTContext(); } +/// Helper to get the language options from the ASTContext. +/// Defined out of line to avoid depending on ASTContext.h. +const LangOptions &Decl::getLangOpts() const { + return getASTContext().getLangOpts(); +} + ASTMutationListener *Decl::getASTMutationListener() const { return getASTContext().getASTMutationListener(); } diff --git a/clang/lib/Analysis/PathDiagnostic.cpp b/clang/lib/Analysis/PathDiagnostic.cpp index 53235ba07699..c88e6c1e1535 100644 --- a/clang/lib/Analysis/PathDiagnostic.cpp +++ b/clang/lib/Analysis/PathDiagnostic.cpp @@ -20,6 +20,7 @@ #include "clang/AST/ExprCXX.h" #include "clang/AST/OperationKinds.h" #include "clang/AST/ParentMap.h" +#include "clang/AST/PrettyPrinter.h" #include "clang/AST/Stmt.h" #include "clang/AST/Type.h" #include "clang/Analysis/AnalysisDeclContext.h" @@ -909,7 +910,7 @@ static void describeClass(raw_ostream &Out, const CXXRecordDecl *D, Out << Prefix << '\'' << *D; if (const auto T = dyn_cast(D)) describeTemplateParameters(Out, T->getTemplateArgs().asArray(), - D->getASTContext().getLangOpts(), "<", ">"); + D->getLangOpts(), "<", ">"); Out << '\''; } @@ -975,8 +976,8 @@ static bool describeCodeDecl(raw_ostream &Out, const Decl *D, if (const auto FD = dyn_cast(D)) if (const TemplateArgumentList *TAList = FD->getTemplateSpecializationArgs()) - describeTemplateParameters(Out, TAList->asArray(), - FD->getASTContext().getLangOpts(), "<", ">"); + describeTemplateParameters(Out, TAList->asArray(), FD->getLangOpts(), "<", + ">"); Out << '\''; return true; diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp index 0783fbed5315..2a91749affd2 100644 --- a/clang/lib/Analysis/ProgramPoint.cpp +++ b/clang/lib/Analysis/ProgramPoint.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/ProgramPoint.h" +#include "clang/AST/ASTContext.h" #include "clang/Basic/JsonSupport.h" using namespace clang; diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 1deca074954f..4915e19753c6 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -17,6 +17,7 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/Expr.h" #include "clang/AST/ExternalASTSource.h" +#include "clang/AST/PrettyPrinter.h" #include "clang/AST/Type.h" #include "clang/AST/TypeOrdering.h" #include "clang/Basic/CodeGenOptions.h" diff --git a/clang/lib/Tooling/Core/Lookup.cpp b/clang/lib/Tooling/Core/Lookup.cpp index aa83e567b774..712724a268fb 100644 --- a/clang/lib/Tooling/Core/Lookup.cpp +++ b/clang/lib/Tooling/Core/Lookup.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "clang/Tooling/Core/Lookup.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclarationName.h"