[clang] c2f1831 - Move ASTRecordReader into its own header; NFC.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Sat Dec 14 11:37:32 PST 2019


One of the commits in this series, likely
https://github.com/llvm/llvm-project/commit/d505e57cc273750541ec8bbce2065b8b87c99ad6
(which for some reason doesn't show up on cfe-commits?)
broke Modules/merge-lifetime-extended-temporary.cpp when using a clang
built at r365097 as host compiler. (Full error log:
http://45.33.8.238/linux/5720/step_7.txt , also copied to the bottom of
this mail for indexing.)

I tried the test with a few other clangs as host compilers and everything
passes (I tried 362913, 369647, and the 9.0 release clang), so this very
likely isn't worth looking into more. But in case others see this failure,
maybe this note helps them.

Nico



Full error:

FAIL: Clang :: Modules/merge-lifetime-extended-temporary.cpp (6905 of 16551)
******************** TEST 'Clang ::
Modules/merge-lifetime-extended-temporary.cpp' FAILED ********************
Script:
--
: 'RUN: at line 1';
/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang -cc1
-internal-isystem
/usr/local/google/home/thakis/src/llvm-project/out/gn/lib/clang/10.0.0/include
-nostdsysteminc -fmodules -fimplicit-module-maps
-fmodules-cache-path=/usr/local/google/home/thakis/src/llvm-project/out/gn/obj/clang/test/Modules/Output/merge-lifetime-extended-temporary.cpp.tmp
-x c++
-I/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/Inputs/merge-lifetime-extended-temporary
-verify -std=c++11
/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/merge-lifetime-extended-temporary.cpp
-DORDER=1
: 'RUN: at line 2';
/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang -cc1
-internal-isystem
/usr/local/google/home/thakis/src/llvm-project/out/gn/lib/clang/10.0.0/include
-nostdsysteminc -fmodules -fimplicit-module-maps
-fmodules-cache-path=/usr/local/google/home/thakis/src/llvm-project/out/gn/obj/clang/test/Modules/Output/merge-lifetime-extended-temporary.cpp.tmp
-x c++
-I/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/Inputs/merge-lifetime-extended-temporary
-verify -std=c++11
/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/merge-lifetime-extended-temporary.cpp
-DORDER=2
--
Exit Code: 134

Command Output (stderr):
--
clang: ../../clang/include/clang/AST/Type.h:666: const
clang::ExtQualsTypeCommonBase *clang::QualType::getCommonPtr() const:
Assertion `!isNull() && "Cannot retrieve a NULL type pointer"' failed.
Stack dump:
0. Program arguments:
/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang -cc1
-internal-isystem
/usr/local/google/home/thakis/src/llvm-project/out/gn/lib/clang/10.0.0/include
-nostdsysteminc -fmodules -fimplicit-module-maps
-fmodules-cache-path=/usr/local/google/home/thakis/src/llvm-project/out/gn/obj/clang/test/Modules/Output/merge-lifetime-extended-temporary.cpp.tmp
-x c++
-I/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/Inputs/merge-lifetime-extended-temporary
-verify -std=c++11
/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/merge-lifetime-extended-temporary.cpp
-DORDER=1
1.
/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/merge-lifetime-extended-temporary.cpp:13:24:
current parser token '=='
 #0 0x0000000003e57cbd PrintStackTraceSignalHandler(void*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x3e57cbd)
 #1 0x0000000003e55a0e llvm::sys::RunSignalHandlers()
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x3e55a0e)
 #2 0x0000000003e57e7c SignalHandler(int)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x3e57e7c)
 #3 0x00007fa76931f3a0 __restore_rt
(/lib/x86_64-linux-gnu/libpthread.so.0+0x123a0)
 #4 0x00007fa7689e6cfb raise
/build/glibc-XAwaOT/glibc-2.28/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
 #5 0x00007fa7689d18ad abort
/build/glibc-XAwaOT/glibc-2.28/stdlib/abort.c:81:7
 #6 0x00007fa7689d177f get_sysdep_segment_value
/build/glibc-XAwaOT/glibc-2.28/intl/loadmsgcat.c:509:8
 #7 0x00007fa7689d177f _nl_load_domain
/build/glibc-XAwaOT/glibc-2.28/intl/loadmsgcat.c:970:34
 #8 0x00007fa7689df542 (/lib/x86_64-linux-gnu/libc.so.6+0x2f542)
 #9 0x0000000002fce25a clang::ASTContext::getCanonicalType(clang::QualType)
const
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x2fce25a)
#10 0x000000000455ebff
clang::ASTContext::getLValueReferenceType(clang::QualType, bool) const
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x455ebff)
#11 0x00000000054064a5 clang::ASTReader::readTypeRecord(unsigned int)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x54064a5)
#12 0x00000000053fb305 clang::ASTReader::GetType(unsigned int)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x53fb305)
#13 0x000000000544a0fe
clang::ASTDeclReader::VisitValueDecl(clang::ValueDecl*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x544a0fe)
#14 0x000000000544a260
clang::ASTDeclReader::VisitDeclaratorDecl(clang::DeclaratorDecl*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x544a260)
#15 0x000000000544e5cc
clang::ASTDeclReader::VisitVarDeclImpl(clang::VarDecl*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x544e5cc)
#16 0x000000000544812f clang::ASTDeclReader::Visit(clang::Decl*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x544812f)
#17 0x000000000546a572 clang::ASTReader::ReadDeclRecord(unsigned int)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x546a572)
#18 0x00000000053fbee0 clang::ASTReader::GetDecl(unsigned int)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x53fbee0)
#19 0x000000000548118e
clang::ASTStmtReader::VisitDeclRefExpr(clang::DeclRefExpr*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x548118e)
#20 0x000000000549098a
clang::ASTReader::ReadStmtFromStream(clang::serialization::ModuleFile&)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x549098a)
#21 0x0000000005490cd6
clang::ASTReader::ReadExpr(clang::serialization::ModuleFile&)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x5490cd6)
#22 0x000000000544eae3
clang::ASTDeclReader::VisitVarDeclImpl(clang::VarDecl*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x544eae3)
#23 0x000000000544812f clang::ASTDeclReader::Visit(clang::Decl*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x544812f)
#24 0x000000000546a572 clang::ASTReader::ReadDeclRecord(unsigned int)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x546a572)
#25 0x000000000540b563
clang::ASTReader::FindExternalVisibleDeclsByName(clang::DeclContext const*,
clang::DeclarationName)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x540b563)
#26 0x00000000046f2b74 clang::DeclContext::lookup(clang::DeclarationName)
const
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x46f2b74)
#27 0x00000000050dc38b LookupDirect(clang::Sema&, clang::LookupResult&,
clang::DeclContext const*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x50dc38b)
#28 0x00000000050d8761 CppNamespaceLookup(clang::Sema&,
clang::LookupResult&, clang::ASTContext&, clang::DeclContext*, (anonymous
namespace)::UnqualUsingDirectiveSet&)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x50d8761)
#29 0x00000000050d7aa1 clang::Sema::CppLookupName(clang::LookupResult&,
clang::Scope*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x50d7aa1)
#30 0x00000000050dbd85 clang::Sema::LookupName(clang::LookupResult&,
clang::Scope*, bool)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x50dbd85)
#31 0x0000000004f55f09 clang::Sema::ActOnIdExpression(clang::Scope*,
clang::CXXScopeSpec&, clang::SourceLocation, clang::UnqualifiedId&, bool,
bool, clang::CorrectionCandidateCallback*, bool, clang::Token*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4f55f09)
#32 0x0000000004b75fde clang::Parser::ParseCastExpression(bool, bool,
bool&, clang::Parser::TypeCastState, bool)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b75fde)
#33 0x0000000004b73abd
clang::Parser::ParseConstantExpressionInExprEvalContext(clang::Parser::TypeCastState)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b73abd)
#34 0x0000000004b2b599
clang::Parser::ParseStaticAssertDeclaration(clang::SourceLocation&)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b2b599)
#35 0x0000000004b47059
clang::Parser::ParseDeclaration(clang::DeclaratorContext,
clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&,
clang::SourceLocation*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b47059)
#36 0x0000000004b1dafb
clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b1dafb)
#37 0x0000000004b1c3a8
clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&,
bool)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b1c3a8)
#38 0x0000000004b17d0d clang::ParseAST(clang::Sema&, bool, bool)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x4b17d0d)
#39 0x00000000034eafa0 clang::FrontendAction::Execute()
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x34eafa0)
#40 0x0000000003448362
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x3448362)
#41 0x0000000003598b22
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x3598b22)
#42 0x0000000002eb1abe cc1_main(llvm::ArrayRef<char const*>, char const*,
void*)
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x2eb1abe)
#43 0x0000000002ebf93e main
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x2ebf93e)
#44 0x00007fa7689d352b __libc_start_main
/build/glibc-XAwaOT/glibc-2.28/csu/../csu/libc-start.c:342:3
#45 0x0000000002eb102a _start
(/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang+0x2eb102a)
/usr/local/google/home/thakis/src/llvm-project/out/gn/obj/clang/test/Modules/Output/merge-lifetime-extended-temporary.cpp.script:
line 2: 180489 Aborted
/usr/local/google/home/thakis/src/llvm-project/out/gn/bin/clang -cc1
-internal-isystem
/usr/local/google/home/thakis/src/llvm-project/out/gn/lib/clang/10.0.0/include
-nostdsysteminc -fmodules -fimplicit-module-maps
-fmodules-cache-path=/usr/local/google/home/thakis/src/llvm-project/out/gn/obj/clang/test/Modules/Output/merge-lifetime-extended-temporary.cpp.tmp
-x c++
-I/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/Inputs/merge-lifetime-extended-temporary
-verify -std=c++11
/usr/local/google/home/thakis/src/llvm-project/clang/test/Modules/merge-lifetime-extended-temporary.cpp
-DORDER=1

On Sat, Dec 14, 2019 at 3:28 AM John McCall via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

>
> Author: John McCall
> Date: 2019-12-14T03:28:23-05:00
> New Revision: c2f18315ff53006e44afe065368019e41cb98053
>
> URL:
> https://github.com/llvm/llvm-project/commit/c2f18315ff53006e44afe065368019e41cb98053
> DIFF:
> https://github.com/llvm/llvm-project/commit/c2f18315ff53006e44afe065368019e41cb98053.diff
>
> LOG: Move ASTRecordReader into its own header; NFC.
>
> AbstractBasicReader.h has quite a few dependencies already,
> and that's only likely to increase.  Meanwhile, ASTRecordReader
> is really an implementation detail of the ASTReader that is only
> used in a small number of places.
>
> I've kept it in a public header for the use of projects like Swift
> that might want to plug in to Clang's serialization framework.
>
> I've also moved OMPClauseReader into an implementation file,
> although it can't be made private because of friendship.
>
> Added:
>     clang/include/clang/Serialization/ASTRecordReader.h
>
> Modified:
>     clang/include/clang/Serialization/ASTReader.h
>     clang/lib/Serialization/ASTReader.cpp
>     clang/lib/Serialization/ASTReaderDecl.cpp
>     clang/lib/Serialization/ASTReaderStmt.cpp
>     clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/clang/include/clang/Serialization/ASTReader.h
> b/clang/include/clang/Serialization/ASTReader.h
> index 3f321f03d966..e74bf00e0872 100644
> --- a/clang/include/clang/Serialization/ASTReader.h
> +++ b/clang/include/clang/Serialization/ASTReader.h
> @@ -13,26 +13,16 @@
>  #ifndef LLVM_CLANG_SERIALIZATION_ASTREADER_H
>  #define LLVM_CLANG_SERIALIZATION_ASTREADER_H
>
> -#include "clang/AST/AbstractBasicReader.h"
> -#include "clang/AST/DeclCXX.h"
> -#include "clang/AST/DeclObjC.h"
> -#include "clang/AST/DeclarationName.h"
> -#include "clang/AST/NestedNameSpecifier.h"
> -#include "clang/AST/OpenMPClause.h"
> -#include "clang/AST/TemplateBase.h"
> -#include "clang/AST/TemplateName.h"
>  #include "clang/AST/Type.h"
>  #include "clang/Basic/Diagnostic.h"
>  #include "clang/Basic/DiagnosticOptions.h"
>  #include "clang/Basic/IdentifierTable.h"
> -#include "clang/Basic/Module.h"
>  #include "clang/Basic/OpenCLOptions.h"
>  #include "clang/Basic/SourceLocation.h"
>  #include "clang/Basic/Version.h"
>  #include "clang/Lex/ExternalPreprocessorSource.h"
>  #include "clang/Lex/HeaderSearch.h"
>  #include "clang/Lex/PreprocessingRecord.h"
> -#include "clang/Lex/Token.h"
>  #include "clang/Sema/ExternalSemaSource.h"
>  #include "clang/Sema/IdentifierResolver.h"
>  #include "clang/Serialization/ASTBitCodes.h"
> @@ -40,9 +30,6 @@
>  #include "clang/Serialization/ModuleFile.h"
>  #include "clang/Serialization/ModuleFileExtension.h"
>  #include "clang/Serialization/ModuleManager.h"
> -#include "llvm/ADT/APFloat.h"
> -#include "llvm/ADT/APInt.h"
> -#include "llvm/ADT/APSInt.h"
>  #include "llvm/ADT/ArrayRef.h"
>  #include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/DenseSet.h"
> @@ -58,8 +45,6 @@
>  #include "llvm/ADT/iterator.h"
>  #include "llvm/ADT/iterator_range.h"
>  #include "llvm/Bitstream/BitstreamReader.h"
> -#include "llvm/Support/Casting.h"
> -#include "llvm/Support/Endian.h"
>  #include "llvm/Support/MemoryBuffer.h"
>  #include "llvm/Support/Timer.h"
>  #include "llvm/Support/VersionTuple.h"
> @@ -83,6 +68,7 @@ class ASTReader;
>  class ASTRecordReader;
>  class CXXTemporary;
>  class Decl;
> +class DeclarationName;
>  class DeclaratorDecl;
>  class DeclContext;
>  class EnumDecl;
> @@ -112,9 +98,8 @@ class SourceManager;
>  class Stmt;
>  class SwitchCase;
>  class TargetOptions;
> -class TemplateParameterList;
> +class Token;
>  class TypedefNameDecl;
> -class TypeSourceInfo;
>  class ValueDecl;
>  class VarDecl;
>
> @@ -2280,341 +2265,6 @@ class ASTReader
>    bool isProcessingUpdateRecords() { return ProcessingUpdateRecords; }
>  };
>
> -/// An object for streaming information from a record.
> -class ASTRecordReader
> -    : public serialization::DataStreamBasicReader<ASTRecordReader> {
> -  using ModuleFile = serialization::ModuleFile;
> -
> -  ASTReader *Reader;
> -  ModuleFile *F;
> -  unsigned Idx = 0;
> -  ASTReader::RecordData Record;
> -
> -  using RecordData = ASTReader::RecordData;
> -  using RecordDataImpl = ASTReader::RecordDataImpl;
> -
> -public:
> -  /// Construct an ASTRecordReader that uses the default encoding scheme.
> -  ASTRecordReader(ASTReader &Reader, ModuleFile &F)
> -    : DataStreamBasicReader(Reader.getContext()), Reader(&Reader), F(&F)
> {}
> -
> -  /// Reads a record with id AbbrevID from Cursor, resetting the
> -  /// internal state.
> -  Expected<unsigned> readRecord(llvm::BitstreamCursor &Cursor,
> -                                unsigned AbbrevID);
> -
> -  /// Is this a module file for a module (rather than a PCH or similar).
> -  bool isModule() const { return F->isModule(); }
> -
> -  /// Retrieve the AST context that this AST reader supplements.
> -  ASTContext &getContext() { return Reader->getContext(); }
> -
> -  /// The current position in this record.
> -  unsigned getIdx() const { return Idx; }
> -
> -  /// The length of this record.
> -  size_t size() const { return Record.size(); }
> -
> -  /// An arbitrary index in this record.
> -  const uint64_t &operator[](size_t N) { return Record[N]; }
> -
> -  /// Returns the last value in this record.
> -  uint64_t back() { return Record.back(); }
> -
> -  /// Returns the current value in this record, and advances to the
> -  /// next value.
> -  uint64_t readInt() { return Record[Idx++]; }
> -
> -  ArrayRef<uint64_t> readIntArray(unsigned Len) {
> -    auto Array = llvm::makeArrayRef(Record).slice(Idx, Len);
> -    Idx += Len;
> -    return Array;
> -  }
> -
> -  /// Returns the current value in this record, without advancing.
> -  uint64_t peekInt() { return Record[Idx]; }
> -
> -  /// Skips the specified number of values.
> -  void skipInts(unsigned N) { Idx += N; }
> -
> -  /// Retrieve the global submodule ID its local ID number.
> -  serialization::SubmoduleID
> -  getGlobalSubmoduleID(unsigned LocalID) {
> -    return Reader->getGlobalSubmoduleID(*F, LocalID);
> -  }
> -
> -  /// Retrieve the submodule that corresponds to a global submodule ID.
> -  Module *getSubmodule(serialization::SubmoduleID GlobalID) {
> -    return Reader->getSubmodule(GlobalID);
> -  }
> -
> -  /// Read the record that describes the lexical contents of a DC.
> -  bool readLexicalDeclContextStorage(uint64_t Offset, DeclContext *DC) {
> -    return Reader->ReadLexicalDeclContextStorage(*F, F->DeclsCursor,
> Offset,
> -                                                 DC);
> -  }
> -
> -  /// Read the record that describes the visible contents of a DC.
> -  bool readVisibleDeclContextStorage(uint64_t Offset,
> -                                     serialization::DeclID ID) {
> -    return Reader->ReadVisibleDeclContextStorage(*F, F->DeclsCursor,
> Offset,
> -                                                 ID);
> -  }
> -
> -  ExplicitSpecifier readExplicitSpec() {
> -    uint64_t Kind = readInt();
> -    bool HasExpr = Kind & 0x1;
> -    Kind = Kind >> 1;
> -    return ExplicitSpecifier(HasExpr ? readExpr() : nullptr,
> -                             static_cast<ExplicitSpecKind>(Kind));
> -  }
> -
> -  /// Read information about an exception specification (inherited).
> -  //FunctionProtoType::ExceptionSpecInfo
> -  //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage);
> -
> -  /// Get the global offset corresponding to a local offset.
> -  uint64_t getGlobalBitOffset(uint32_t LocalOffset) {
> -    return Reader->getGlobalBitOffset(*F, LocalOffset);
> -  }
> -
> -  /// Reads a statement.
> -  Stmt *readStmt() { return Reader->ReadStmt(*F); }
> -  Stmt *readStmtRef() { return readStmt(); /* FIXME: readSubStmt? */ }
> -
> -  /// Reads an expression.
> -  Expr *readExpr() { return Reader->ReadExpr(*F); }
> -
> -  /// Reads a sub-statement operand during statement reading.
> -  Stmt *readSubStmt() { return Reader->ReadSubStmt(); }
> -
> -  /// Reads a sub-expression operand during statement reading.
> -  Expr *readSubExpr() { return Reader->ReadSubExpr(); }
> -
> -  /// Reads a declaration with the given local ID in the given module.
> -  ///
> -  /// \returns The requested declaration, casted to the given return type.
> -  template<typename T>
> -  T *GetLocalDeclAs(uint32_t LocalID) {
> -    return cast_or_null<T>(Reader->GetLocalDecl(*F, LocalID));
> -  }
> -
> -  /// Reads a TemplateArgumentLocInfo appropriate for the
> -  /// given TemplateArgument kind, advancing Idx.
> -  TemplateArgumentLocInfo
> -  readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind);
> -
> -  /// Reads a TemplateArgumentLoc, advancing Idx.
> -  TemplateArgumentLoc readTemplateArgumentLoc();
> -
> -  const ASTTemplateArgumentListInfo*
> -  readASTTemplateArgumentListInfo();
> -
> -  /// Reads a declarator info from the given record, advancing Idx.
> -  TypeSourceInfo *readTypeSourceInfo();
> -
> -  /// Reads the location information for a type.
> -  void readTypeLoc(TypeLoc TL);
> -
> -
> -  /// Map a local type ID within a given AST file to a global type ID.
> -  serialization::TypeID getGlobalTypeID(unsigned LocalID) const {
> -    return Reader->getGlobalTypeID(*F, LocalID);
> -  }
> -
> -  Qualifiers readQualifiers() {
> -    return Qualifiers::fromOpaqueValue(readInt());
> -  }
> -
> -  /// Read a type from the current position in the record.
> -  QualType readType() {
> -    return Reader->readType(*F, Record, Idx);
> -  }
> -  QualType readQualType() {
> -    return readType();
> -  }
> -
> -  /// Reads a declaration ID from the given position in this record.
> -  ///
> -  /// \returns The declaration ID read from the record, adjusted to a
> global ID.
> -  serialization::DeclID readDeclID() {
> -    return Reader->ReadDeclID(*F, Record, Idx);
> -  }
> -
> -  /// Reads a declaration from the given position in a record in the
> -  /// given module, advancing Idx.
> -  Decl *readDecl() {
> -    return Reader->ReadDecl(*F, Record, Idx);
> -  }
> -  Decl *readDeclRef() {
> -    return readDecl();
> -  }
> -
> -  /// Reads a declaration from the given position in the record,
> -  /// advancing Idx.
> -  ///
> -  /// \returns The declaration read from this location, casted to the
> given
> -  /// result type.
> -  template<typename T>
> -  T *readDeclAs() {
> -    return Reader->ReadDeclAs<T>(*F, Record, Idx);
> -  }
> -
> -  IdentifierInfo *readIdentifier() {
> -    return Reader->readIdentifier(*F, Record, Idx);
> -  }
> -
> -  /// Read a selector from the Record, advancing Idx.
> -  Selector readSelector() {
> -    return Reader->ReadSelector(*F, Record, Idx);
> -  }
> -
> -  /// Read a declaration name, advancing Idx.
> -  // DeclarationName readDeclarationName(); (inherited)
> -  DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name);
> -  DeclarationNameInfo readDeclarationNameInfo();
> -
> -  void readQualifierInfo(QualifierInfo &Info);
> -
> -  /// Return a nested name specifier, advancing Idx.
> -  // NestedNameSpecifier *readNestedNameSpecifier(); (inherited)
> -
> -  NestedNameSpecifierLoc readNestedNameSpecifierLoc();
> -
> -  /// Read a template name, advancing Idx.
> -  // TemplateName readTemplateName(); (inherited)
> -
> -  /// Read a template argument, advancing Idx. (inherited)
> -  // TemplateArgument readTemplateArgument(bool Canonicalize = false);
> -
> -  /// Read a template parameter list, advancing Idx.
> -  TemplateParameterList *readTemplateParameterList();
> -
> -  /// Read a template argument array, advancing Idx.
> -  void readTemplateArgumentList(SmallVectorImpl<TemplateArgument>
> &TemplArgs,
> -                                bool Canonicalize = false);
> -
> -  /// Read a UnresolvedSet structure, advancing Idx.
> -  void readUnresolvedSet(LazyASTUnresolvedSet &Set);
> -
> -  /// Read a C++ base specifier, advancing Idx.
> -  CXXBaseSpecifier readCXXBaseSpecifier();
> -
> -  /// Read a CXXCtorInitializer array, advancing Idx.
> -  CXXCtorInitializer **readCXXCtorInitializers();
> -
> -  CXXTemporary *readCXXTemporary() {
> -    return Reader->ReadCXXTemporary(*F, Record, Idx);
> -  }
> -
> -  /// Read a source location, advancing Idx.
> -  SourceLocation readSourceLocation() {
> -    return Reader->ReadSourceLocation(*F, Record, Idx);
> -  }
> -
> -  /// Read a source range, advancing Idx.
> -  SourceRange readSourceRange() {
> -    return Reader->ReadSourceRange(*F, Record, Idx);
> -  }
> -
> -  /// Read an arbitrary constant value, advancing Idx.
> -  APValue readAPValue();
> -
> -  /// Read an integral value, advancing Idx.
> -  // llvm::APInt readAPInt(); (inherited)
> -
> -  /// Read a signed integral value, advancing Idx.
> -  // llvm::APSInt readAPSInt(); (inherited)
> -
> -  /// Read a floating-point value, advancing Idx.
> -  llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem);
> -
> -  /// Read a boolean value, advancing Idx.
> -  bool readBool() { return readInt() != 0; }
> -
> -  /// Read a 32-bit unsigned value; required to satisfy BasicReader.
> -  uint32_t readUInt32() {
> -    return uint32_t(readInt());
> -  }
> -
> -  /// Read a 64-bit unsigned value; required to satisfy BasicReader.
> -  uint64_t readUInt64() {
> -    return readInt();
> -  }
> -
> -  /// Read a string, advancing Idx.
> -  std::string readString() {
> -    return Reader->ReadString(Record, Idx);
> -  }
> -
> -  /// Read a path, advancing Idx.
> -  std::string readPath() {
> -    return Reader->ReadPath(*F, Record, Idx);
> -  }
> -
> -  /// Read a version tuple, advancing Idx.
> -  VersionTuple readVersionTuple() {
> -    return ASTReader::ReadVersionTuple(Record, Idx);
> -  }
> -
> -  /// Reads one attribute from the current stream position, advancing Idx.
> -  Attr *readAttr();
> -
> -  /// Reads attributes from the current stream position, advancing Idx.
> -  void readAttributes(AttrVec &Attrs);
> -
> -  /// Reads a token out of a record, advancing Idx.
> -  Token readToken() {
> -    return Reader->ReadToken(*F, Record, Idx);
> -  }
> -
> -  void recordSwitchCaseID(SwitchCase *SC, unsigned ID) {
> -    Reader->RecordSwitchCaseID(SC, ID);
> -  }
> -
> -  /// Retrieve the switch-case statement with the given ID.
> -  SwitchCase *getSwitchCaseWithID(unsigned ID) {
> -    return Reader->getSwitchCaseWithID(ID);
> -  }
> -};
> -
> -/// Helper class that saves the current stream position and
> -/// then restores it when destroyed.
> -struct SavedStreamPosition {
> -  explicit SavedStreamPosition(llvm::BitstreamCursor &Cursor)
> -      : Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) {}
> -
> -  ~SavedStreamPosition() {
> -    if (llvm::Error Err = Cursor.JumpToBit(Offset))
> -      llvm::report_fatal_error(
> -          "Cursor should always be able to go back, failed: " +
> -          toString(std::move(Err)));
> -  }
> -
> -private:
> -  llvm::BitstreamCursor &Cursor;
> -  uint64_t Offset;
> -};
> -
> -inline void PCHValidator::Error(const char *Msg) {
> -  Reader.Error(Msg);
> -}
> -
> -class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
> -  ASTRecordReader &Record;
> -  ASTContext &Context;
> -
> -public:
> -  OMPClauseReader(ASTRecordReader &Record)
> -      : Record(Record), Context(Record.getContext()) {}
> -
> -#define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C);
> -#include "clang/Basic/OpenMPKinds.def"
> -  OMPClause *readClause();
> -  void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
> -  void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
> -};
> -
>  } // namespace clang
>
>  #endif // LLVM_CLANG_SERIALIZATION_ASTREADER_H
>
> diff  --git a/clang/include/clang/Serialization/ASTRecordReader.h
> b/clang/include/clang/Serialization/ASTRecordReader.h
> new file mode 100644
> index 000000000000..4fad2881ffd9
> --- /dev/null
> +++ b/clang/include/clang/Serialization/ASTRecordReader.h
> @@ -0,0 +1,351 @@
> +//===- ASTRecordReader.h - Helper classes for reading AST -------*- C++
> -*-===//
> +//
> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM
> Exceptions.
> +// See https://llvm.org/LICENSE.txt for license information.
> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +//  This file defines classes that are useful in the implementation of
> +//  the ASTReader.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H
> +#define LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H
> +
> +#include "clang/AST/AbstractBasicReader.h"
> +#include "clang/Lex/Token.h"
> +#include "clang/Serialization/ASTReader.h"
> +#include "llvm/ADT/APFloat.h"
> +#include "llvm/ADT/APInt.h"
> +#include "llvm/ADT/APSInt.h"
> +
> +namespace clang {
> +
> +/// An object for streaming information from a record.
> +class ASTRecordReader
> +    : public serialization::DataStreamBasicReader<ASTRecordReader> {
> +  using ModuleFile = serialization::ModuleFile;
> +
> +  ASTReader *Reader;
> +  ModuleFile *F;
> +  unsigned Idx = 0;
> +  ASTReader::RecordData Record;
> +
> +  using RecordData = ASTReader::RecordData;
> +  using RecordDataImpl = ASTReader::RecordDataImpl;
> +
> +public:
> +  /// Construct an ASTRecordReader that uses the default encoding scheme.
> +  ASTRecordReader(ASTReader &Reader, ModuleFile &F)
> +    : DataStreamBasicReader(Reader.getContext()), Reader(&Reader), F(&F)
> {}
> +
> +  /// Reads a record with id AbbrevID from Cursor, resetting the
> +  /// internal state.
> +  Expected<unsigned> readRecord(llvm::BitstreamCursor &Cursor,
> +                                unsigned AbbrevID);
> +
> +  /// Is this a module file for a module (rather than a PCH or similar).
> +  bool isModule() const { return F->isModule(); }
> +
> +  /// Retrieve the AST context that this AST reader supplements.
> +  ASTContext &getContext() { return Reader->getContext(); }
> +
> +  /// The current position in this record.
> +  unsigned getIdx() const { return Idx; }
> +
> +  /// The length of this record.
> +  size_t size() const { return Record.size(); }
> +
> +  /// An arbitrary index in this record.
> +  const uint64_t &operator[](size_t N) { return Record[N]; }
> +
> +  /// Returns the last value in this record.
> +  uint64_t back() { return Record.back(); }
> +
> +  /// Returns the current value in this record, and advances to the
> +  /// next value.
> +  uint64_t readInt() { return Record[Idx++]; }
> +
> +  ArrayRef<uint64_t> readIntArray(unsigned Len) {
> +    auto Array = llvm::makeArrayRef(Record).slice(Idx, Len);
> +    Idx += Len;
> +    return Array;
> +  }
> +
> +  /// Returns the current value in this record, without advancing.
> +  uint64_t peekInt() { return Record[Idx]; }
> +
> +  /// Skips the specified number of values.
> +  void skipInts(unsigned N) { Idx += N; }
> +
> +  /// Retrieve the global submodule ID its local ID number.
> +  serialization::SubmoduleID
> +  getGlobalSubmoduleID(unsigned LocalID) {
> +    return Reader->getGlobalSubmoduleID(*F, LocalID);
> +  }
> +
> +  /// Retrieve the submodule that corresponds to a global submodule ID.
> +  Module *getSubmodule(serialization::SubmoduleID GlobalID) {
> +    return Reader->getSubmodule(GlobalID);
> +  }
> +
> +  /// Read the record that describes the lexical contents of a DC.
> +  bool readLexicalDeclContextStorage(uint64_t Offset, DeclContext *DC) {
> +    return Reader->ReadLexicalDeclContextStorage(*F, F->DeclsCursor,
> Offset,
> +                                                 DC);
> +  }
> +
> +  /// Read the record that describes the visible contents of a DC.
> +  bool readVisibleDeclContextStorage(uint64_t Offset,
> +                                     serialization::DeclID ID) {
> +    return Reader->ReadVisibleDeclContextStorage(*F, F->DeclsCursor,
> Offset,
> +                                                 ID);
> +  }
> +
> +  ExplicitSpecifier readExplicitSpec() {
> +    uint64_t Kind = readInt();
> +    bool HasExpr = Kind & 0x1;
> +    Kind = Kind >> 1;
> +    return ExplicitSpecifier(HasExpr ? readExpr() : nullptr,
> +                             static_cast<ExplicitSpecKind>(Kind));
> +  }
> +
> +  /// Read information about an exception specification (inherited).
> +  //FunctionProtoType::ExceptionSpecInfo
> +  //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage);
> +
> +  /// Get the global offset corresponding to a local offset.
> +  uint64_t getGlobalBitOffset(uint32_t LocalOffset) {
> +    return Reader->getGlobalBitOffset(*F, LocalOffset);
> +  }
> +
> +  /// Reads a statement.
> +  Stmt *readStmt() { return Reader->ReadStmt(*F); }
> +  Stmt *readStmtRef() { return readStmt(); /* FIXME: readSubStmt? */ }
> +
> +  /// Reads an expression.
> +  Expr *readExpr() { return Reader->ReadExpr(*F); }
> +
> +  /// Reads a sub-statement operand during statement reading.
> +  Stmt *readSubStmt() { return Reader->ReadSubStmt(); }
> +
> +  /// Reads a sub-expression operand during statement reading.
> +  Expr *readSubExpr() { return Reader->ReadSubExpr(); }
> +
> +  /// Reads a declaration with the given local ID in the given module.
> +  ///
> +  /// \returns The requested declaration, casted to the given return type.
> +  template<typename T>
> +  T *GetLocalDeclAs(uint32_t LocalID) {
> +    return cast_or_null<T>(Reader->GetLocalDecl(*F, LocalID));
> +  }
> +
> +  /// Reads a TemplateArgumentLocInfo appropriate for the
> +  /// given TemplateArgument kind, advancing Idx.
> +  TemplateArgumentLocInfo
> +  readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind);
> +
> +  /// Reads a TemplateArgumentLoc, advancing Idx.
> +  TemplateArgumentLoc readTemplateArgumentLoc();
> +
> +  const ASTTemplateArgumentListInfo*
> +  readASTTemplateArgumentListInfo();
> +
> +  /// Reads a declarator info from the given record, advancing Idx.
> +  TypeSourceInfo *readTypeSourceInfo();
> +
> +  /// Reads the location information for a type.
> +  void readTypeLoc(TypeLoc TL);
> +
> +
> +  /// Map a local type ID within a given AST file to a global type ID.
> +  serialization::TypeID getGlobalTypeID(unsigned LocalID) const {
> +    return Reader->getGlobalTypeID(*F, LocalID);
> +  }
> +
> +  Qualifiers readQualifiers() {
> +    return Qualifiers::fromOpaqueValue(readInt());
> +  }
> +
> +  /// Read a type from the current position in the record.
> +  QualType readType() {
> +    return Reader->readType(*F, Record, Idx);
> +  }
> +  QualType readQualType() {
> +    return readType();
> +  }
> +
> +  /// Reads a declaration ID from the given position in this record.
> +  ///
> +  /// \returns The declaration ID read from the record, adjusted to a
> global ID.
> +  serialization::DeclID readDeclID() {
> +    return Reader->ReadDeclID(*F, Record, Idx);
> +  }
> +
> +  /// Reads a declaration from the given position in a record in the
> +  /// given module, advancing Idx.
> +  Decl *readDecl() {
> +    return Reader->ReadDecl(*F, Record, Idx);
> +  }
> +  Decl *readDeclRef() {
> +    return readDecl();
> +  }
> +
> +  /// Reads a declaration from the given position in the record,
> +  /// advancing Idx.
> +  ///
> +  /// \returns The declaration read from this location, casted to the
> given
> +  /// result type.
> +  template<typename T>
> +  T *readDeclAs() {
> +    return Reader->ReadDeclAs<T>(*F, Record, Idx);
> +  }
> +
> +  IdentifierInfo *readIdentifier() {
> +    return Reader->readIdentifier(*F, Record, Idx);
> +  }
> +
> +  /// Read a selector from the Record, advancing Idx.
> +  Selector readSelector() {
> +    return Reader->ReadSelector(*F, Record, Idx);
> +  }
> +
> +  /// Read a declaration name, advancing Idx.
> +  // DeclarationName readDeclarationName(); (inherited)
> +  DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name);
> +  DeclarationNameInfo readDeclarationNameInfo();
> +
> +  void readQualifierInfo(QualifierInfo &Info);
> +
> +  /// Return a nested name specifier, advancing Idx.
> +  // NestedNameSpecifier *readNestedNameSpecifier(); (inherited)
> +
> +  NestedNameSpecifierLoc readNestedNameSpecifierLoc();
> +
> +  /// Read a template name, advancing Idx.
> +  // TemplateName readTemplateName(); (inherited)
> +
> +  /// Read a template argument, advancing Idx. (inherited)
> +  // TemplateArgument readTemplateArgument(bool Canonicalize = false);
> +
> +  /// Read a template parameter list, advancing Idx.
> +  TemplateParameterList *readTemplateParameterList();
> +
> +  /// Read a template argument array, advancing Idx.
> +  void readTemplateArgumentList(SmallVectorImpl<TemplateArgument>
> &TemplArgs,
> +                                bool Canonicalize = false);
> +
> +  /// Read a UnresolvedSet structure, advancing Idx.
> +  void readUnresolvedSet(LazyASTUnresolvedSet &Set);
> +
> +  /// Read a C++ base specifier, advancing Idx.
> +  CXXBaseSpecifier readCXXBaseSpecifier();
> +
> +  /// Read a CXXCtorInitializer array, advancing Idx.
> +  CXXCtorInitializer **readCXXCtorInitializers();
> +
> +  CXXTemporary *readCXXTemporary() {
> +    return Reader->ReadCXXTemporary(*F, Record, Idx);
> +  }
> +
> +  /// Read an OpenMP clause, advancing Idx.
> +  OMPClause *readOMPClause();
> +
> +  /// Read a source location, advancing Idx.
> +  SourceLocation readSourceLocation() {
> +    return Reader->ReadSourceLocation(*F, Record, Idx);
> +  }
> +
> +  /// Read a source range, advancing Idx.
> +  SourceRange readSourceRange() {
> +    return Reader->ReadSourceRange(*F, Record, Idx);
> +  }
> +
> +  /// Read an arbitrary constant value, advancing Idx.
> +  APValue readAPValue();
> +
> +  /// Read an integral value, advancing Idx.
> +  // llvm::APInt readAPInt(); (inherited)
> +
> +  /// Read a signed integral value, advancing Idx.
> +  // llvm::APSInt readAPSInt(); (inherited)
> +
> +  /// Read a floating-point value, advancing Idx.
> +  llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem);
> +
> +  /// Read a boolean value, advancing Idx.
> +  bool readBool() { return readInt() != 0; }
> +
> +  /// Read a 32-bit unsigned value; required to satisfy BasicReader.
> +  uint32_t readUInt32() {
> +    return uint32_t(readInt());
> +  }
> +
> +  /// Read a 64-bit unsigned value; required to satisfy BasicReader.
> +  uint64_t readUInt64() {
> +    return readInt();
> +  }
> +
> +  /// Read a string, advancing Idx.
> +  std::string readString() {
> +    return Reader->ReadString(Record, Idx);
> +  }
> +
> +  /// Read a path, advancing Idx.
> +  std::string readPath() {
> +    return Reader->ReadPath(*F, Record, Idx);
> +  }
> +
> +  /// Read a version tuple, advancing Idx.
> +  VersionTuple readVersionTuple() {
> +    return ASTReader::ReadVersionTuple(Record, Idx);
> +  }
> +
> +  /// Reads one attribute from the current stream position, advancing Idx.
> +  Attr *readAttr();
> +
> +  /// Reads attributes from the current stream position, advancing Idx.
> +  void readAttributes(AttrVec &Attrs);
> +
> +  /// Reads a token out of a record, advancing Idx.
> +  Token readToken() {
> +    return Reader->ReadToken(*F, Record, Idx);
> +  }
> +
> +  void recordSwitchCaseID(SwitchCase *SC, unsigned ID) {
> +    Reader->RecordSwitchCaseID(SC, ID);
> +  }
> +
> +  /// Retrieve the switch-case statement with the given ID.
> +  SwitchCase *getSwitchCaseWithID(unsigned ID) {
> +    return Reader->getSwitchCaseWithID(ID);
> +  }
> +};
> +
> +/// Helper class that saves the current stream position and
> +/// then restores it when destroyed.
> +struct SavedStreamPosition {
> +  explicit SavedStreamPosition(llvm::BitstreamCursor &Cursor)
> +      : Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) {}
> +
> +  ~SavedStreamPosition() {
> +    if (llvm::Error Err = Cursor.JumpToBit(Offset))
> +      llvm::report_fatal_error(
> +          "Cursor should always be able to go back, failed: " +
> +          toString(std::move(Err)));
> +  }
> +
> +private:
> +  llvm::BitstreamCursor &Cursor;
> +  uint64_t Offset;
> +};
> +
> +inline void PCHValidator::Error(const char *Msg) {
> +  Reader.Error(Msg);
> +}
> +
> +} // namespace clang
> +
> +#endif
>
> diff  --git a/clang/lib/Serialization/ASTReader.cpp
> b/clang/lib/Serialization/ASTReader.cpp
> index c85cfcd3a33f..a2e4e7b469c9 100644
> --- a/clang/lib/Serialization/ASTReader.cpp
> +++ b/clang/lib/Serialization/ASTReader.cpp
> @@ -10,7 +10,7 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>
> -#include "clang/Serialization/ASTReader.h"
> +#include "clang/Serialization/ASTRecordReader.h"
>  #include "ASTCommon.h"
>  #include "ASTReaderInternals.h"
>  #include "clang/AST/AbstractTypeReader.h"
> @@ -30,6 +30,7 @@
>  #include "clang/AST/ExprCXX.h"
>  #include "clang/AST/ExternalASTSource.h"
>  #include "clang/AST/NestedNameSpecifier.h"
> +#include "clang/AST/OpenMPClause.h"
>  #include "clang/AST/ODRHash.h"
>  #include "clang/AST/RawCommentList.h"
>  #include "clang/AST/TemplateBase.h"
> @@ -11471,6 +11472,31 @@ Expected<unsigned>
> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
>  //// OMPClauseReader implementation
>
>  ////===----------------------------------------------------------------------===//
>
> +// This has to be in namespace clang because it's friended by all
> +// of the OMP clauses.
> +namespace clang {
> +
> +class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
> +  ASTRecordReader &Record;
> +  ASTContext &Context;
> +
> +public:
> +  OMPClauseReader(ASTRecordReader &Record)
> +      : Record(Record), Context(Record.getContext()) {}
> +
> +#define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C);
> +#include "clang/Basic/OpenMPKinds.def"
> +  OMPClause *readClause();
> +  void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
> +  void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
> +};
> +
> +} // end namespace clang
> +
> +OMPClause *ASTRecordReader::readOMPClause() {
> +  return OMPClauseReader(*this).readClause();
> +}
> +
>  OMPClause *OMPClauseReader::readClause() {
>    OMPClause *C = nullptr;
>    switch (Record.readInt()) {
>
> diff  --git a/clang/lib/Serialization/ASTReaderDecl.cpp
> b/clang/lib/Serialization/ASTReaderDecl.cpp
> index 229bea8b031f..0240984d75a5 100644
> --- a/clang/lib/Serialization/ASTReaderDecl.cpp
> +++ b/clang/lib/Serialization/ASTReaderDecl.cpp
> @@ -48,7 +48,7 @@
>  #include "clang/Basic/Specifiers.h"
>  #include "clang/Sema/IdentifierResolver.h"
>  #include "clang/Serialization/ASTBitCodes.h"
> -#include "clang/Serialization/ASTReader.h"
> +#include "clang/Serialization/ASTRecordReader.h"
>  #include "clang/Serialization/ContinuousRangeMap.h"
>  #include "clang/Serialization/ModuleFile.h"
>  #include "llvm/ADT/DenseMap.h"
> @@ -2630,9 +2630,8 @@ void
> ASTDeclReader::VisitOMPAllocateDecl(OMPAllocateDecl *D) {
>    D->setVars(Vars);
>    SmallVector<OMPClause *, 8> Clauses;
>    Clauses.reserve(NumClauses);
> -  OMPClauseReader ClauseReader(Record);
>    for (unsigned I = 0; I != NumClauses; ++I)
> -    Clauses.push_back(ClauseReader.readClause());
> +    Clauses.push_back(Record.readOMPClause());
>    D->setClauses(Clauses);
>  }
>
> @@ -2641,9 +2640,8 @@ void
> ASTDeclReader::VisitOMPRequiresDecl(OMPRequiresDecl * D) {
>    unsigned NumClauses = D->clauselist_size();
>    SmallVector<OMPClause *, 8> Clauses;
>    Clauses.reserve(NumClauses);
> -  OMPClauseReader ClauseReader(Record);
>    for (unsigned I = 0; I != NumClauses; ++I)
> -    Clauses.push_back(ClauseReader.readClause());
> +    Clauses.push_back(Record.readOMPClause());
>    D->setClauses(Clauses);
>  }
>
> @@ -2674,9 +2672,8 @@ void
> ASTDeclReader::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D) {
>    unsigned NumClauses = D->clauselist_size();
>    SmallVector<OMPClause *, 8> Clauses;
>    Clauses.reserve(NumClauses);
> -  OMPClauseReader ClauseReader(Record);
>    for (unsigned I = 0; I != NumClauses; ++I)
> -    Clauses.push_back(ClauseReader.readClause());
> +    Clauses.push_back(Record.readOMPClause());
>    D->setClauses(Clauses);
>  }
>
>
> diff  --git a/clang/lib/Serialization/ASTReaderStmt.cpp
> b/clang/lib/Serialization/ASTReaderStmt.cpp
> index 5d7c6762061c..533502116ed7 100644
> --- a/clang/lib/Serialization/ASTReaderStmt.cpp
> +++ b/clang/lib/Serialization/ASTReaderStmt.cpp
> @@ -11,7 +11,7 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>
> -#include "clang/Serialization/ASTReader.h"
> +#include "clang/Serialization/ASTRecordReader.h"
>  #include "clang/AST/ASTConcept.h"
>  #include "clang/AST/ASTContext.h"
>  #include "clang/AST/AttrIterator.h"
> @@ -67,8 +67,6 @@ using namespace serialization;
>  namespace clang {
>
>    class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
> -    friend class OMPClauseReader;
> -
>      ASTRecordReader &Record;
>      llvm::BitstreamCursor &DeclsCursor;
>
> @@ -2026,10 +2024,9 @@ void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
>  void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective
> *E) {
>    E->setLocStart(readSourceLocation());
>    E->setLocEnd(readSourceLocation());
> -  OMPClauseReader ClauseReader(Record);
>    SmallVector<OMPClause *, 5> Clauses;
>    for (unsigned i = 0; i < E->getNumClauses(); ++i)
> -    Clauses.push_back(ClauseReader.readClause());
> +    Clauses.push_back(Record.readOMPClause());
>    E->setClauses(Clauses);
>    if (E->hasAssociatedStmt())
>      E->setAssociatedStmt(Record.readSubStmt());
>
> diff  --git a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
> b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
> index 687fda75db48..7baae6778ebd 100644
> --- a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
> +++ b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
> @@ -11,6 +11,7 @@
>  #include "clang/Basic/IdentifierTable.h"
>  #include "clang/Basic/LangStandard.h"
>  #include "clang/Basic/Stack.h"
> +#include "clang/AST/DeclObjC.h"
>  #include "clang/Frontend/ASTUnit.h"
>  #include "clang/Frontend/CompilerInstance.h"
>  #include "clang/Frontend/FrontendAction.h"
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191214/1090408a/attachment-0001.html>


More information about the cfe-commits mailing list