r374484 - Move most CXXRecordDecl::DefinitionData bit-fields out into a separate

Adrian Prantl via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 10 18:41:42 PDT 2019


Hi Richard,

it's possible that this broke the module build

http://lab.llvm.org:8080/green/view/LLDB/job/lldb-cmake/2482/consoleFull#-432653710a1ca8a51-895e-46c6-af87-ce24fa4cd561 <http://lab.llvm.org:8080/green/view/LLDB/job/lldb-cmake/2482/consoleFull#-432653710a1ca8a51-895e-46c6-af87-ce24fa4cd561>

/Users/buildslave/jenkins/workspace/lldb-cmake/host-compiler/bin/clang++  -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Itools/clang/lib/Parse -I/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/lib/Parse -I/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include -Itools/clang/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/libxml2 -Iinclude -I/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/llvm/include -Wdocumentation -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -std=c++14 -fmodules -fmodules-cache-path=/Users/buildslave/jenkins/workspace/lldb-cmake/lldb-build/module.cache -fcxx-modules -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion -fdiagnostics-color -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk   -UNDEBUG  -fno-exceptions -fno-rtti -MD -MT tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseAST.cpp.o -MF tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseAST.cpp.o.d -o tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseAST.cpp.o -c /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/lib/Parse/ParseAST.cpp
While building module 'Clang_Parse' imported from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/lib/Parse/ParseAST.cpp:13:
While building module 'Clang_AST' imported from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/Parse/Parser.h:16:
In file included from <module-includes>:1:
In file included from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/AST/ASTNodeTraverser.h:20:
In file included from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/AST/DeclVisitor.h:18:
 <>/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/AST/DeclCXX.h:282:5: fatal error: import of module 'Clang_AST.CXXRecordDeclDefinitionBits' appears within 'clang::CXXRecordDecl::DefinitionData'
    #include "CXXRecordDeclDefinitionBits.def"
    ^
/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/AST/DeclCXX.h:279:3: note: 'clang::CXXRecordDecl::DefinitionData' begins here
  struct DefinitionData {
  ^
While building module 'Clang_Parse' imported from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/lib/Parse/ParseAST.cpp:13:
In file included from <module-includes>:1:
In file included from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/Parse/RAIIObjectsForParser.h:18:
/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/Parse/Parser.h:16:10: fatal error: could not build module 'Clang_AST'
#include "clang/AST/OpenMPClause.h"
 ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
While building module 'Clang_Parse' imported from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/lib/Parse/ParseAST.cpp:13:
While building module 'Clang_Sema' imported from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/Parse/Parser.h:24:
In file included from <module-includes>:1:
In file included from /Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/Sema/MultiplexExternalSemaSource.h:15:
/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/include/clang/Sema/ExternalSemaSource.h:15:10: fatal error: could not build module 'Clang_AST'
#include "clang/AST/ExternalASTSource.h"
 ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/buildslave/jenkins/workspace/lldb-cmake/llvm-project/clang/lib/Parse/ParseAST.cpp:13:10: fatal error: could not build module 'Clang_Parse'
#include "clang/Parse/ParseAST.h"
 ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
4 errors generated.

> On Oct 10, 2019, at 5:29 PM, Richard Smith via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: rsmith
> Date: Thu Oct 10 17:29:04 2019
> New Revision: 374484
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=374484&view=rev
> Log:
> Move most CXXRecordDecl::DefinitionData bit-fields out into a separate
> file.
> 
> Reduces duplication and thereby reduces the risk that someone will
> forget to update one of these places, as I did when adding
> DefaultedDestructorIsConstexpr (though I've been unable to produce
> a testcase for which that matters so far).
> 
> Added:
>    cfe/trunk/include/clang/AST/CXXRecordDeclDefinitionBits.def
> Modified:
>    cfe/trunk/include/clang/AST/DeclCXX.h
>    cfe/trunk/lib/AST/ASTImporter.cpp
>    cfe/trunk/lib/AST/DeclCXX.cpp
>    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>    cfe/trunk/lib/Serialization/ASTWriter.cpp
> 
> Added: cfe/trunk/include/clang/AST/CXXRecordDeclDefinitionBits.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CXXRecordDeclDefinitionBits.def?rev=374484&view=auto
> ==============================================================================
> --- cfe/trunk/include/clang/AST/CXXRecordDeclDefinitionBits.def (added)
> +++ cfe/trunk/include/clang/AST/CXXRecordDeclDefinitionBits.def Thu Oct 10 17:29:04 2019
> @@ -0,0 +1,236 @@
> +//===-- CXXRecordDeclDefinitionBits.def - Class definition bits -*- 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 enumerates the various bitfields that we want to store on C++ class
> +// definitions.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +/// @file CXXRecordDeclDefinitionBits.def
> +///
> +/// In this file, each of the bitfields representing data about a C++ class
> +/// results in an expansion of the FIELD macro, which should be defined before
> +/// including this file.
> +///
> +/// The macro have three operands:
> +///
> +/// Name: The name of the field, as a member of CXXRecordDecl::DefinitionData.
> +///
> +/// BitWidth: The width of the field in bits.
> +///
> +/// MergePolicy: How to behave when the value of the field is different in
> +/// multiple translation units, one of:
> +///   NO_MERGE: It is an ODR violation if the fields do not match.
> +///   MERGE_OR: Merge the fields by ORing them together.
> +
> +#ifndef FIELD
> +#error define FIELD before including this file
> +#endif
> +
> +/// True if this class has any user-declared constructors.
> +FIELD(UserDeclaredConstructor, 1, NO_MERGE)
> +
> +/// The user-declared special members which this class has.
> +FIELD(UserDeclaredSpecialMembers, 6, NO_MERGE)
> +
> +/// True when this class is an aggregate.
> +FIELD(Aggregate, 1, NO_MERGE)
> +
> +/// True when this class is a POD-type.
> +FIELD(PlainOldData, 1, NO_MERGE)
> +
> +/// True when this class is empty for traits purposes, that is:
> +///  * has no data members other than 0-width bit-fields and empty fields
> +///    marked [[no_unique_address]]
> +///  * has no virtual function/base, and
> +///  * doesn't inherit from a non-empty class.
> +/// Doesn't take union-ness into account.
> +FIELD(Empty, 1, NO_MERGE)
> +
> +/// True when this class is polymorphic, i.e., has at
> +/// least one virtual member or derives from a polymorphic class.
> +FIELD(Polymorphic, 1, NO_MERGE)
> +
> +/// True when this class is abstract, i.e., has at least
> +/// one pure virtual function, (that can come from a base class).
> +FIELD(Abstract, 1, NO_MERGE)
> +
> +/// True when this class is standard-layout, per the applicable
> +/// language rules (including DRs).
> +FIELD(IsStandardLayout, 1, NO_MERGE)
> +
> +/// True when this class was standard-layout under the C++11
> +/// definition.
> +///
> +/// C++11 [class]p7.  A standard-layout class is a class that:
> +/// * has no non-static data members of type non-standard-layout class (or
> +///   array of such types) or reference,
> +/// * has no virtual functions (10.3) and no virtual base classes (10.1),
> +/// * has the same access control (Clause 11) for all non-static data
> +///   members
> +/// * has no non-standard-layout base classes,
> +/// * either has no non-static data members in the most derived class and at
> +///   most one base class with non-static data members, or has no base
> +///   classes with non-static data members, and
> +/// * has no base classes of the same type as the first non-static data
> +///   member.
> +FIELD(IsCXX11StandardLayout, 1, NO_MERGE)
> +
> +/// True when any base class has any declared non-static data
> +/// members or bit-fields.
> +/// This is a helper bit of state used to implement IsStandardLayout more
> +/// efficiently.
> +FIELD(HasBasesWithFields, 1, NO_MERGE)
> +
> +/// True when any base class has any declared non-static data
> +/// members.
> +/// This is a helper bit of state used to implement IsCXX11StandardLayout
> +/// more efficiently.
> +FIELD(HasBasesWithNonStaticDataMembers, 1, NO_MERGE)
> +
> +/// True when there are private non-static data members.
> +FIELD(HasPrivateFields, 1, NO_MERGE)
> +
> +/// True when there are protected non-static data members.
> +FIELD(HasProtectedFields, 1, NO_MERGE)
> +
> +/// True when there are private non-static data members.
> +FIELD(HasPublicFields, 1, NO_MERGE)
> +
> +/// True if this class (or any subobject) has mutable fields.
> +FIELD(HasMutableFields, 1, NO_MERGE)
> +
> +/// True if this class (or any nested anonymous struct or union)
> +/// has variant members.
> +FIELD(HasVariantMembers, 1, NO_MERGE)
> +
> +/// True if there no non-field members declared by the user.
> +FIELD(HasOnlyCMembers, 1, NO_MERGE)
> +
> +/// True if any field has an in-class initializer, including those
> +/// within anonymous unions or structs.
> +FIELD(HasInClassInitializer, 1, NO_MERGE)
> +
> +/// True if any field is of reference type, and does not have an
> +/// in-class initializer.
> +///
> +/// In this case, value-initialization of this class is illegal in C++98
> +/// even if the class has a trivial default constructor.
> +FIELD(HasUninitializedReferenceMember, 1, NO_MERGE)
> +
> +/// True if any non-mutable field whose type doesn't have a user-
> +/// provided default ctor also doesn't have an in-class initializer.
> +FIELD(HasUninitializedFields, 1, NO_MERGE)
> +
> +/// True if there are any member using-declarations that inherit
> +/// constructors from a base class.
> +FIELD(HasInheritedConstructor, 1, NO_MERGE)
> +
> +/// True if there are any member using-declarations named
> +/// 'operator='.
> +FIELD(HasInheritedAssignment, 1, NO_MERGE)
> +
> +/// These flags are \c true if a defaulted corresponding special
> +/// member can't be fully analyzed without performing overload resolution.
> +/// @{
> +FIELD(NeedOverloadResolutionForCopyConstructor, 1, NO_MERGE)
> +FIELD(NeedOverloadResolutionForMoveConstructor, 1, NO_MERGE)
> +FIELD(NeedOverloadResolutionForMoveAssignment, 1, NO_MERGE)
> +FIELD(NeedOverloadResolutionForDestructor, 1, NO_MERGE)
> +/// @}
> +
> +/// These flags are \c true if an implicit defaulted corresponding
> +/// special member would be defined as deleted.
> +/// @{
> +FIELD(DefaultedCopyConstructorIsDeleted, 1, NO_MERGE)
> +FIELD(DefaultedMoveConstructorIsDeleted, 1, NO_MERGE)
> +FIELD(DefaultedMoveAssignmentIsDeleted, 1, NO_MERGE)
> +FIELD(DefaultedDestructorIsDeleted, 1, NO_MERGE)
> +/// @}
> +
> +/// The trivial special members which this class has, per
> +/// C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25,
> +/// C++11 [class.dtor]p5, or would have if the member were not suppressed.
> +///
> +/// This excludes any user-declared but not user-provided special members
> +/// which have been declared but not yet defined.
> +FIELD(HasTrivialSpecialMembers, 6, MERGE_OR)
> +
> +/// These bits keep track of the triviality of special functions for the
> +/// purpose of calls. Only the bits corresponding to SMF_CopyConstructor,
> +/// SMF_MoveConstructor, and SMF_Destructor are meaningful here.
> +FIELD(HasTrivialSpecialMembersForCall, 6, MERGE_OR)
> +
> +/// The declared special members of this class which are known to be
> +/// non-trivial.
> +///
> +/// This excludes any user-declared but not user-provided special members
> +/// which have been declared but not yet defined, and any implicit special
> +/// members which have not yet been declared.
> +FIELD(DeclaredNonTrivialSpecialMembers, 6, MERGE_OR)
> +
> +/// These bits keep track of the declared special members that are
> +/// non-trivial for the purpose of calls.
> +/// Only the bits corresponding to SMF_CopyConstructor,
> +/// SMF_MoveConstructor, and SMF_Destructor are meaningful here.
> +FIELD(DeclaredNonTrivialSpecialMembersForCall, 6, MERGE_OR)
> +
> +/// True when this class has a destructor with no semantic effect.
> +FIELD(HasIrrelevantDestructor, 1, NO_MERGE)
> +
> +/// True when this class has at least one user-declared constexpr
> +/// constructor which is neither the copy nor move constructor.
> +FIELD(HasConstexprNonCopyMoveConstructor, 1, MERGE_OR)
> +
> +/// True if this class has a (possibly implicit) defaulted default
> +/// constructor.
> +FIELD(HasDefaultedDefaultConstructor, 1, MERGE_OR)
> +
> +/// True if a defaulted default constructor for this class would
> +/// be constexpr.
> +FIELD(DefaultedDefaultConstructorIsConstexpr, 1, NO_MERGE)
> +
> +/// True if this class has a constexpr default constructor.
> +///
> +/// This is true for either a user-declared constexpr default constructor
> +/// or an implicitly declared constexpr default constructor.
> +FIELD(HasConstexprDefaultConstructor, 1, MERGE_OR)
> +
> +/// True if a defaulted destructor for this class would be constexpr.
> +FIELD(DefaultedDestructorIsConstexpr, 1, NO_MERGE)
> +
> +/// True when this class contains at least one non-static data
> +/// member or base class of non-literal or volatile type.
> +FIELD(HasNonLiteralTypeFieldsOrBases, 1, NO_MERGE)
> +
> +/// Whether we have a C++11 user-provided default constructor (not
> +/// explicitly deleted or defaulted).
> +FIELD(UserProvidedDefaultConstructor, 1, NO_MERGE)
> +
> +/// The special members which have been declared for this class,
> +/// either by the user or implicitly.
> +FIELD(DeclaredSpecialMembers, 6, MERGE_OR)
> +
> +/// Whether an implicit copy constructor could have a const-qualified
> +/// parameter, for initializing virtual bases and for other subobjects.
> +FIELD(ImplicitCopyConstructorCanHaveConstParamForVBase, 1, NO_MERGE)
> +FIELD(ImplicitCopyConstructorCanHaveConstParamForNonVBase, 1, NO_MERGE)
> +
> +/// Whether an implicit copy assignment operator would have a
> +/// const-qualified parameter.
> +FIELD(ImplicitCopyAssignmentHasConstParam, 1, NO_MERGE)
> +
> +/// Whether any declared copy constructor has a const-qualified
> +/// parameter.
> +FIELD(HasDeclaredCopyConstructorWithConstParam, 1, MERGE_OR)
> +
> +/// Whether any declared copy assignment operator has either a
> +/// const-qualified reference parameter or a non-reference parameter.
> +FIELD(HasDeclaredCopyAssignmentWithConstParam, 1, MERGE_OR)
> +
> +#undef FIELD
> 
> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=374484&r1=374483&r2=374484&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
> +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Oct 10 17:29:04 2019
> @@ -277,210 +277,9 @@ class CXXRecordDecl : public RecordDecl
>   };
> 
>   struct DefinitionData {
> -    /// True if this class has any user-declared constructors.
> -    unsigned UserDeclaredConstructor : 1;
> -
> -    /// The user-declared special members which this class has.
> -    unsigned UserDeclaredSpecialMembers : 6;
> -
> -    /// True when this class is an aggregate.
> -    unsigned Aggregate : 1;
> -
> -    /// True when this class is a POD-type.
> -    unsigned PlainOldData : 1;
> -
> -    /// True when this class is empty for traits purposes, that is:
> -    ///  * has no data members other than 0-width bit-fields and empty fields
> -    ///    marked [[no_unique_address]]
> -    ///  * has no virtual function/base, and
> -    ///  * doesn't inherit from a non-empty class.
> -    /// Doesn't take union-ness into account.
> -    unsigned Empty : 1;
> -
> -    /// True when this class is polymorphic, i.e., has at
> -    /// least one virtual member or derives from a polymorphic class.
> -    unsigned Polymorphic : 1;
> -
> -    /// True when this class is abstract, i.e., has at least
> -    /// one pure virtual function, (that can come from a base class).
> -    unsigned Abstract : 1;
> -
> -    /// True when this class is standard-layout, per the applicable
> -    /// language rules (including DRs).
> -    unsigned IsStandardLayout : 1;
> -
> -    /// True when this class was standard-layout under the C++11
> -    /// definition.
> -    ///
> -    /// C++11 [class]p7.  A standard-layout class is a class that:
> -    /// * has no non-static data members of type non-standard-layout class (or
> -    ///   array of such types) or reference,
> -    /// * has no virtual functions (10.3) and no virtual base classes (10.1),
> -    /// * has the same access control (Clause 11) for all non-static data
> -    ///   members
> -    /// * has no non-standard-layout base classes,
> -    /// * either has no non-static data members in the most derived class and at
> -    ///   most one base class with non-static data members, or has no base
> -    ///   classes with non-static data members, and
> -    /// * has no base classes of the same type as the first non-static data
> -    ///   member.
> -    unsigned IsCXX11StandardLayout : 1;
> -
> -    /// True when any base class has any declared non-static data
> -    /// members or bit-fields.
> -    /// This is a helper bit of state used to implement IsStandardLayout more
> -    /// efficiently.
> -    unsigned HasBasesWithFields : 1;
> -
> -    /// True when any base class has any declared non-static data
> -    /// members.
> -    /// This is a helper bit of state used to implement IsCXX11StandardLayout
> -    /// more efficiently.
> -    unsigned HasBasesWithNonStaticDataMembers : 1;
> -
> -    /// True when there are private non-static data members.
> -    unsigned HasPrivateFields : 1;
> -
> -    /// True when there are protected non-static data members.
> -    unsigned HasProtectedFields : 1;
> -
> -    /// True when there are private non-static data members.
> -    unsigned HasPublicFields : 1;
> -
> -    /// True if this class (or any subobject) has mutable fields.
> -    unsigned HasMutableFields : 1;
> -
> -    /// True if this class (or any nested anonymous struct or union)
> -    /// has variant members.
> -    unsigned HasVariantMembers : 1;
> -
> -    /// True if there no non-field members declared by the user.
> -    unsigned HasOnlyCMembers : 1;
> -
> -    /// True if any field has an in-class initializer, including those
> -    /// within anonymous unions or structs.
> -    unsigned HasInClassInitializer : 1;
> -
> -    /// True if any field is of reference type, and does not have an
> -    /// in-class initializer.
> -    ///
> -    /// In this case, value-initialization of this class is illegal in C++98
> -    /// even if the class has a trivial default constructor.
> -    unsigned HasUninitializedReferenceMember : 1;
> -
> -    /// True if any non-mutable field whose type doesn't have a user-
> -    /// provided default ctor also doesn't have an in-class initializer.
> -    unsigned HasUninitializedFields : 1;
> -
> -    /// True if there are any member using-declarations that inherit
> -    /// constructors from a base class.
> -    unsigned HasInheritedConstructor : 1;
> -
> -    /// True if there are any member using-declarations named
> -    /// 'operator='.
> -    unsigned HasInheritedAssignment : 1;
> -
> -    /// These flags are \c true if a defaulted corresponding special
> -    /// member can't be fully analyzed without performing overload resolution.
> -    /// @{
> -    unsigned NeedOverloadResolutionForCopyConstructor : 1;
> -    unsigned NeedOverloadResolutionForMoveConstructor : 1;
> -    unsigned NeedOverloadResolutionForMoveAssignment : 1;
> -    unsigned NeedOverloadResolutionForDestructor : 1;
> -    /// @}
> -
> -    /// These flags are \c true if an implicit defaulted corresponding
> -    /// special member would be defined as deleted.
> -    /// @{
> -    unsigned DefaultedCopyConstructorIsDeleted : 1;
> -    unsigned DefaultedMoveConstructorIsDeleted : 1;
> -    unsigned DefaultedMoveAssignmentIsDeleted : 1;
> -    unsigned DefaultedDestructorIsDeleted : 1;
> -    /// @}
> -
> -    /// The trivial special members which this class has, per
> -    /// C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25,
> -    /// C++11 [class.dtor]p5, or would have if the member were not suppressed.
> -    ///
> -    /// This excludes any user-declared but not user-provided special members
> -    /// which have been declared but not yet defined.
> -    unsigned HasTrivialSpecialMembers : 6;
> -
> -    /// These bits keep track of the triviality of special functions for the
> -    /// purpose of calls. Only the bits corresponding to SMF_CopyConstructor,
> -    /// SMF_MoveConstructor, and SMF_Destructor are meaningful here.
> -    unsigned HasTrivialSpecialMembersForCall : 6;
> -
> -    /// The declared special members of this class which are known to be
> -    /// non-trivial.
> -    ///
> -    /// This excludes any user-declared but not user-provided special members
> -    /// which have been declared but not yet defined, and any implicit special
> -    /// members which have not yet been declared.
> -    unsigned DeclaredNonTrivialSpecialMembers : 6;
> -
> -    /// These bits keep track of the declared special members that are
> -    /// non-trivial for the purpose of calls.
> -    /// Only the bits corresponding to SMF_CopyConstructor,
> -    /// SMF_MoveConstructor, and SMF_Destructor are meaningful here.
> -    unsigned DeclaredNonTrivialSpecialMembersForCall : 6;
> -
> -    /// True when this class has a destructor with no semantic effect.
> -    unsigned HasIrrelevantDestructor : 1;
> -
> -    /// True when this class has at least one user-declared constexpr
> -    /// constructor which is neither the copy nor move constructor.
> -    unsigned HasConstexprNonCopyMoveConstructor : 1;
> -
> -    /// True if this class has a (possibly implicit) defaulted default
> -    /// constructor.
> -    unsigned HasDefaultedDefaultConstructor : 1;
> -
> -    /// True if a defaulted default constructor for this class would
> -    /// be constexpr.
> -    unsigned DefaultedDefaultConstructorIsConstexpr : 1;
> -
> -    /// True if this class has a constexpr default constructor.
> -    ///
> -    /// This is true for either a user-declared constexpr default constructor
> -    /// or an implicitly declared constexpr default constructor.
> -    unsigned HasConstexprDefaultConstructor : 1;
> -
> -    /// True if a defaulted destructor for this class would be constexpr.
> -    unsigned DefaultedDestructorIsConstexpr : 1;
> -
> -    /// True when this class contains at least one non-static data
> -    /// member or base class of non-literal or volatile type.
> -    unsigned HasNonLiteralTypeFieldsOrBases : 1;
> -
> -    /// True when visible conversion functions are already computed
> -    /// and are available.
> -    unsigned ComputedVisibleConversions : 1;
> -
> -    /// Whether we have a C++11 user-provided default constructor (not
> -    /// explicitly deleted or defaulted).
> -    unsigned UserProvidedDefaultConstructor : 1;
> -
> -    /// The special members which have been declared for this class,
> -    /// either by the user or implicitly.
> -    unsigned DeclaredSpecialMembers : 6;
> -
> -    /// Whether an implicit copy constructor could have a const-qualified
> -    /// parameter, for initializing virtual bases and for other subobjects.
> -    unsigned ImplicitCopyConstructorCanHaveConstParamForVBase : 1;
> -    unsigned ImplicitCopyConstructorCanHaveConstParamForNonVBase : 1;
> -
> -    /// Whether an implicit copy assignment operator would have a
> -    /// const-qualified parameter.
> -    unsigned ImplicitCopyAssignmentHasConstParam : 1;
> -
> -    /// Whether any declared copy constructor has a const-qualified
> -    /// parameter.
> -    unsigned HasDeclaredCopyConstructorWithConstParam : 1;
> -
> -    /// Whether any declared copy assignment operator has either a
> -    /// const-qualified reference parameter or a non-reference parameter.
> -    unsigned HasDeclaredCopyAssignmentWithConstParam : 1;
> +    #define FIELD(Name, Width, Merge) \
> +    unsigned Name : Width;
> +    #include "CXXRecordDeclDefinitionBits.def"
> 
>     /// Whether this class describes a C++ lambda.
>     unsigned IsLambda : 1;
> @@ -488,6 +287,10 @@ class CXXRecordDecl : public RecordDecl
>     /// Whether we are currently parsing base specifiers.
>     unsigned IsParsingBaseSpecifiers : 1;
> 
> +    /// True when visible conversion functions are already computed
> +    /// and are available.
> +    unsigned ComputedVisibleConversions : 1;
> +
>     unsigned HasODRHash : 1;
> 
>     /// A hash of parts of the class to help in ODR checking.
> 
> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=374484&r1=374483&r2=374484&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
> +++ cfe/trunk/lib/AST/ASTImporter.cpp Thu Oct 10 17:29:04 2019
> @@ -1836,71 +1836,10 @@ Error ASTNodeImporter::ImportDefinition(
> 
>     struct CXXRecordDecl::DefinitionData &ToData = ToCXX->data();
>     struct CXXRecordDecl::DefinitionData &FromData = FromCXX->data();
> -    ToData.UserDeclaredConstructor = FromData.UserDeclaredConstructor;
> -    ToData.UserDeclaredSpecialMembers = FromData.UserDeclaredSpecialMembers;
> -    ToData.Aggregate = FromData.Aggregate;
> -    ToData.PlainOldData = FromData.PlainOldData;
> -    ToData.Empty = FromData.Empty;
> -    ToData.Polymorphic = FromData.Polymorphic;
> -    ToData.Abstract = FromData.Abstract;
> -    ToData.IsStandardLayout = FromData.IsStandardLayout;
> -    ToData.IsCXX11StandardLayout = FromData.IsCXX11StandardLayout;
> -    ToData.HasBasesWithFields = FromData.HasBasesWithFields;
> -    ToData.HasBasesWithNonStaticDataMembers =
> -        FromData.HasBasesWithNonStaticDataMembers;
> -    ToData.HasPrivateFields = FromData.HasPrivateFields;
> -    ToData.HasProtectedFields = FromData.HasProtectedFields;
> -    ToData.HasPublicFields = FromData.HasPublicFields;
> -    ToData.HasMutableFields = FromData.HasMutableFields;
> -    ToData.HasVariantMembers = FromData.HasVariantMembers;
> -    ToData.HasOnlyCMembers = FromData.HasOnlyCMembers;
> -    ToData.HasInClassInitializer = FromData.HasInClassInitializer;
> -    ToData.HasUninitializedReferenceMember
> -      = FromData.HasUninitializedReferenceMember;
> -    ToData.HasUninitializedFields = FromData.HasUninitializedFields;
> -    ToData.HasInheritedConstructor = FromData.HasInheritedConstructor;
> -    ToData.HasInheritedAssignment = FromData.HasInheritedAssignment;
> -    ToData.NeedOverloadResolutionForCopyConstructor
> -      = FromData.NeedOverloadResolutionForCopyConstructor;
> -    ToData.NeedOverloadResolutionForMoveConstructor
> -      = FromData.NeedOverloadResolutionForMoveConstructor;
> -    ToData.NeedOverloadResolutionForMoveAssignment
> -      = FromData.NeedOverloadResolutionForMoveAssignment;
> -    ToData.NeedOverloadResolutionForDestructor
> -      = FromData.NeedOverloadResolutionForDestructor;
> -    ToData.DefaultedCopyConstructorIsDeleted
> -      = FromData.DefaultedCopyConstructorIsDeleted;
> -    ToData.DefaultedMoveConstructorIsDeleted
> -      = FromData.DefaultedMoveConstructorIsDeleted;
> -    ToData.DefaultedMoveAssignmentIsDeleted
> -      = FromData.DefaultedMoveAssignmentIsDeleted;
> -    ToData.DefaultedDestructorIsDeleted = FromData.DefaultedDestructorIsDeleted;
> -    ToData.HasTrivialSpecialMembers = FromData.HasTrivialSpecialMembers;
> -    ToData.HasIrrelevantDestructor = FromData.HasIrrelevantDestructor;
> -    ToData.HasConstexprNonCopyMoveConstructor
> -      = FromData.HasConstexprNonCopyMoveConstructor;
> -    ToData.HasDefaultedDefaultConstructor
> -      = FromData.HasDefaultedDefaultConstructor;
> -    ToData.DefaultedDefaultConstructorIsConstexpr
> -      = FromData.DefaultedDefaultConstructorIsConstexpr;
> -    ToData.HasConstexprDefaultConstructor
> -      = FromData.HasConstexprDefaultConstructor;
> -    ToData.HasNonLiteralTypeFieldsOrBases
> -      = FromData.HasNonLiteralTypeFieldsOrBases;
> -    // ComputedVisibleConversions not imported.
> -    ToData.UserProvidedDefaultConstructor
> -      = FromData.UserProvidedDefaultConstructor;
> -    ToData.DeclaredSpecialMembers = FromData.DeclaredSpecialMembers;
> -    ToData.ImplicitCopyConstructorCanHaveConstParamForVBase
> -      = FromData.ImplicitCopyConstructorCanHaveConstParamForVBase;
> -    ToData.ImplicitCopyConstructorCanHaveConstParamForNonVBase
> -      = FromData.ImplicitCopyConstructorCanHaveConstParamForNonVBase;
> -    ToData.ImplicitCopyAssignmentHasConstParam
> -      = FromData.ImplicitCopyAssignmentHasConstParam;
> -    ToData.HasDeclaredCopyConstructorWithConstParam
> -      = FromData.HasDeclaredCopyConstructorWithConstParam;
> -    ToData.HasDeclaredCopyAssignmentWithConstParam
> -      = FromData.HasDeclaredCopyAssignmentWithConstParam;
> +
> +    #define FIELD(Name, Width, Merge) \
> +    ToData.Name = FromData.Name;
> +    #include "clang/AST/CXXRecordDeclDefinitionBits.def"
> 
>     // Copy over the data stored in RecordDeclBits
>     ToCXX->setArgPassingRestrictions(FromCXX->getArgPassingRestrictions());
> 
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=374484&r1=374483&r2=374484&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Oct 10 17:29:04 2019
> @@ -96,14 +96,15 @@ CXXRecordDecl::DefinitionData::Definitio
>       DefaultedDefaultConstructorIsConstexpr(true),
>       HasConstexprDefaultConstructor(false),
>       DefaultedDestructorIsConstexpr(true),
> -      HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
> +      HasNonLiteralTypeFieldsOrBases(false),
>       UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
>       ImplicitCopyConstructorCanHaveConstParamForVBase(true),
>       ImplicitCopyConstructorCanHaveConstParamForNonVBase(true),
>       ImplicitCopyAssignmentHasConstParam(true),
>       HasDeclaredCopyConstructorWithConstParam(false),
>       HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false),
> -      IsParsingBaseSpecifiers(false), HasODRHash(false), Definition(D) {}
> +      IsParsingBaseSpecifiers(false), ComputedVisibleConversions(false),
> +      HasODRHash(false), Definition(D) {}
> 
> CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
>   return Bases.get(Definition->getASTContext().getExternalSource());
> 
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=374484&r1=374483&r2=374484&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Oct 10 17:29:04 2019
> @@ -1656,55 +1656,11 @@ void ASTDeclReader::VisitUnresolvedUsing
> 
> void ASTDeclReader::ReadCXXDefinitionData(
>     struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D) {
> +  #define FIELD(Name, Width, Merge) \
> +  Data.Name = Record.readInt();
> +  #include "clang/AST/CXXRecordDeclDefinitionBits.def"
> +
>   // Note: the caller has deserialized the IsLambda bit already.
> -  Data.UserDeclaredConstructor = Record.readInt();
> -  Data.UserDeclaredSpecialMembers = Record.readInt();
> -  Data.Aggregate = Record.readInt();
> -  Data.PlainOldData = Record.readInt();
> -  Data.Empty = Record.readInt();
> -  Data.Polymorphic = Record.readInt();
> -  Data.Abstract = Record.readInt();
> -  Data.IsStandardLayout = Record.readInt();
> -  Data.IsCXX11StandardLayout = Record.readInt();
> -  Data.HasBasesWithFields = Record.readInt();
> -  Data.HasBasesWithNonStaticDataMembers = Record.readInt();
> -  Data.HasPrivateFields = Record.readInt();
> -  Data.HasProtectedFields = Record.readInt();
> -  Data.HasPublicFields = Record.readInt();
> -  Data.HasMutableFields = Record.readInt();
> -  Data.HasVariantMembers = Record.readInt();
> -  Data.HasOnlyCMembers = Record.readInt();
> -  Data.HasInClassInitializer = Record.readInt();
> -  Data.HasUninitializedReferenceMember = Record.readInt();
> -  Data.HasUninitializedFields = Record.readInt();
> -  Data.HasInheritedConstructor = Record.readInt();
> -  Data.HasInheritedAssignment = Record.readInt();
> -  Data.NeedOverloadResolutionForCopyConstructor = Record.readInt();
> -  Data.NeedOverloadResolutionForMoveConstructor = Record.readInt();
> -  Data.NeedOverloadResolutionForMoveAssignment = Record.readInt();
> -  Data.NeedOverloadResolutionForDestructor = Record.readInt();
> -  Data.DefaultedCopyConstructorIsDeleted = Record.readInt();
> -  Data.DefaultedMoveConstructorIsDeleted = Record.readInt();
> -  Data.DefaultedMoveAssignmentIsDeleted = Record.readInt();
> -  Data.DefaultedDestructorIsDeleted = Record.readInt();
> -  Data.HasTrivialSpecialMembers = Record.readInt();
> -  Data.HasTrivialSpecialMembersForCall = Record.readInt();
> -  Data.DeclaredNonTrivialSpecialMembers = Record.readInt();
> -  Data.DeclaredNonTrivialSpecialMembersForCall = Record.readInt();
> -  Data.HasIrrelevantDestructor = Record.readInt();
> -  Data.HasConstexprNonCopyMoveConstructor = Record.readInt();
> -  Data.HasDefaultedDefaultConstructor = Record.readInt();
> -  Data.DefaultedDefaultConstructorIsConstexpr = Record.readInt();
> -  Data.HasConstexprDefaultConstructor = Record.readInt();
> -  Data.HasNonLiteralTypeFieldsOrBases = Record.readInt();
> -  Data.ComputedVisibleConversions = Record.readInt();
> -  Data.UserProvidedDefaultConstructor = Record.readInt();
> -  Data.DeclaredSpecialMembers = Record.readInt();
> -  Data.ImplicitCopyConstructorCanHaveConstParamForVBase = Record.readInt();
> -  Data.ImplicitCopyConstructorCanHaveConstParamForNonVBase = Record.readInt();
> -  Data.ImplicitCopyAssignmentHasConstParam = Record.readInt();
> -  Data.HasDeclaredCopyConstructorWithConstParam = Record.readInt();
> -  Data.HasDeclaredCopyAssignmentWithConstParam = Record.readInt();
>   Data.ODRHash = Record.readInt();
>   Data.HasODRHash = true;
> 
> @@ -1719,7 +1675,9 @@ void ASTDeclReader::ReadCXXDefinitionDat
>     Data.VBases = ReadGlobalOffset();
> 
>   Record.readUnresolvedSet(Data.Conversions);
> -  Record.readUnresolvedSet(Data.VisibleConversions);
> +  Data.ComputedVisibleConversions = Record.readInt();
> +  if (Data.ComputedVisibleConversions)
> +    Record.readUnresolvedSet(Data.VisibleConversions);
>   assert(Data.Definition && "Data.Definition should be already set!");
>   Data.FirstFriend = ReadDeclID();
> 
> @@ -1792,63 +1750,17 @@ void ASTDeclReader::MergeDefinitionData(
>     return;
>   }
> 
> -  // FIXME: Move this out into a .def file?
>   bool DetectedOdrViolation = false;
> -#define OR_FIELD(Field) DD.Field |= MergeDD.Field;
> -#define MATCH_FIELD(Field) \
> +
> +  #define FIELD(Name, Width, Merge) Merge(Name)
> +  #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
> +  #define NO_MERGE(Field) \
>     DetectedOdrViolation |= DD.Field != MergeDD.Field; \
> -    OR_FIELD(Field)
> -  MATCH_FIELD(UserDeclaredConstructor)
> -  MATCH_FIELD(UserDeclaredSpecialMembers)
> -  MATCH_FIELD(Aggregate)
> -  MATCH_FIELD(PlainOldData)
> -  MATCH_FIELD(Empty)
> -  MATCH_FIELD(Polymorphic)
> -  MATCH_FIELD(Abstract)
> -  MATCH_FIELD(IsStandardLayout)
> -  MATCH_FIELD(IsCXX11StandardLayout)
> -  MATCH_FIELD(HasBasesWithFields)
> -  MATCH_FIELD(HasBasesWithNonStaticDataMembers)
> -  MATCH_FIELD(HasPrivateFields)
> -  MATCH_FIELD(HasProtectedFields)
> -  MATCH_FIELD(HasPublicFields)
> -  MATCH_FIELD(HasMutableFields)
> -  MATCH_FIELD(HasVariantMembers)
> -  MATCH_FIELD(HasOnlyCMembers)
> -  MATCH_FIELD(HasInClassInitializer)
> -  MATCH_FIELD(HasUninitializedReferenceMember)
> -  MATCH_FIELD(HasUninitializedFields)
> -  MATCH_FIELD(HasInheritedConstructor)
> -  MATCH_FIELD(HasInheritedAssignment)
> -  MATCH_FIELD(NeedOverloadResolutionForCopyConstructor)
> -  MATCH_FIELD(NeedOverloadResolutionForMoveConstructor)
> -  MATCH_FIELD(NeedOverloadResolutionForMoveAssignment)
> -  MATCH_FIELD(NeedOverloadResolutionForDestructor)
> -  MATCH_FIELD(DefaultedCopyConstructorIsDeleted)
> -  MATCH_FIELD(DefaultedMoveConstructorIsDeleted)
> -  MATCH_FIELD(DefaultedMoveAssignmentIsDeleted)
> -  MATCH_FIELD(DefaultedDestructorIsDeleted)
> -  OR_FIELD(HasTrivialSpecialMembers)
> -  OR_FIELD(HasTrivialSpecialMembersForCall)
> -  OR_FIELD(DeclaredNonTrivialSpecialMembers)
> -  OR_FIELD(DeclaredNonTrivialSpecialMembersForCall)
> -  MATCH_FIELD(HasIrrelevantDestructor)
> -  OR_FIELD(HasConstexprNonCopyMoveConstructor)
> -  OR_FIELD(HasDefaultedDefaultConstructor)
> -  MATCH_FIELD(DefaultedDefaultConstructorIsConstexpr)
> -  OR_FIELD(HasConstexprDefaultConstructor)
> -  MATCH_FIELD(HasNonLiteralTypeFieldsOrBases)
> -  // ComputedVisibleConversions is handled below.
> -  MATCH_FIELD(UserProvidedDefaultConstructor)
> -  OR_FIELD(DeclaredSpecialMembers)
> -  MATCH_FIELD(ImplicitCopyConstructorCanHaveConstParamForVBase)
> -  MATCH_FIELD(ImplicitCopyConstructorCanHaveConstParamForNonVBase)
> -  MATCH_FIELD(ImplicitCopyAssignmentHasConstParam)
> -  OR_FIELD(HasDeclaredCopyConstructorWithConstParam)
> -  OR_FIELD(HasDeclaredCopyAssignmentWithConstParam)
> -  MATCH_FIELD(IsLambda)
> -#undef OR_FIELD
> -#undef MATCH_FIELD
> +    MERGE_OR(Field)
> +  #include "clang/AST/CXXRecordDeclDefinitionBits.def"
> +  NO_MERGE(IsLambda)
> +  #undef NO_MERGE
> +  #undef MERGE_OR
> 
>   if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
>     DetectedOdrViolation = true;
> 
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=374484&r1=374483&r2=374484&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Oct 10 17:29:04 2019
> @@ -6141,54 +6141,10 @@ void ASTRecordWriter::AddCXXCtorInitiali
> void ASTRecordWriter::AddCXXDefinitionData(const CXXRecordDecl *D) {
>   auto &Data = D->data();
>   Record->push_back(Data.IsLambda);
> -  Record->push_back(Data.UserDeclaredConstructor);
> -  Record->push_back(Data.UserDeclaredSpecialMembers);
> -  Record->push_back(Data.Aggregate);
> -  Record->push_back(Data.PlainOldData);
> -  Record->push_back(Data.Empty);
> -  Record->push_back(Data.Polymorphic);
> -  Record->push_back(Data.Abstract);
> -  Record->push_back(Data.IsStandardLayout);
> -  Record->push_back(Data.IsCXX11StandardLayout);
> -  Record->push_back(Data.HasBasesWithFields);
> -  Record->push_back(Data.HasBasesWithNonStaticDataMembers);
> -  Record->push_back(Data.HasPrivateFields);
> -  Record->push_back(Data.HasProtectedFields);
> -  Record->push_back(Data.HasPublicFields);
> -  Record->push_back(Data.HasMutableFields);
> -  Record->push_back(Data.HasVariantMembers);
> -  Record->push_back(Data.HasOnlyCMembers);
> -  Record->push_back(Data.HasInClassInitializer);
> -  Record->push_back(Data.HasUninitializedReferenceMember);
> -  Record->push_back(Data.HasUninitializedFields);
> -  Record->push_back(Data.HasInheritedConstructor);
> -  Record->push_back(Data.HasInheritedAssignment);
> -  Record->push_back(Data.NeedOverloadResolutionForCopyConstructor);
> -  Record->push_back(Data.NeedOverloadResolutionForMoveConstructor);
> -  Record->push_back(Data.NeedOverloadResolutionForMoveAssignment);
> -  Record->push_back(Data.NeedOverloadResolutionForDestructor);
> -  Record->push_back(Data.DefaultedCopyConstructorIsDeleted);
> -  Record->push_back(Data.DefaultedMoveConstructorIsDeleted);
> -  Record->push_back(Data.DefaultedMoveAssignmentIsDeleted);
> -  Record->push_back(Data.DefaultedDestructorIsDeleted);
> -  Record->push_back(Data.HasTrivialSpecialMembers);
> -  Record->push_back(Data.HasTrivialSpecialMembersForCall);
> -  Record->push_back(Data.DeclaredNonTrivialSpecialMembers);
> -  Record->push_back(Data.DeclaredNonTrivialSpecialMembersForCall);
> -  Record->push_back(Data.HasIrrelevantDestructor);
> -  Record->push_back(Data.HasConstexprNonCopyMoveConstructor);
> -  Record->push_back(Data.HasDefaultedDefaultConstructor);
> -  Record->push_back(Data.DefaultedDefaultConstructorIsConstexpr);
> -  Record->push_back(Data.HasConstexprDefaultConstructor);
> -  Record->push_back(Data.HasNonLiteralTypeFieldsOrBases);
> -  Record->push_back(Data.ComputedVisibleConversions);
> -  Record->push_back(Data.UserProvidedDefaultConstructor);
> -  Record->push_back(Data.DeclaredSpecialMembers);
> -  Record->push_back(Data.ImplicitCopyConstructorCanHaveConstParamForVBase);
> -  Record->push_back(Data.ImplicitCopyConstructorCanHaveConstParamForNonVBase);
> -  Record->push_back(Data.ImplicitCopyAssignmentHasConstParam);
> -  Record->push_back(Data.HasDeclaredCopyConstructorWithConstParam);
> -  Record->push_back(Data.HasDeclaredCopyAssignmentWithConstParam);
> +
> +  #define FIELD(Name, Width, Merge) \
> +  Record->push_back(Data.Name);
> +  #include "clang/AST/CXXRecordDeclDefinitionBits.def"
> 
>   // getODRHash will compute the ODRHash if it has not been previously computed.
>   Record->push_back(D->getODRHash());
> @@ -6210,7 +6166,9 @@ void ASTRecordWriter::AddCXXDefinitionDa
>     AddCXXBaseSpecifiers(Data.vbases());
> 
>   AddUnresolvedSet(Data.Conversions.get(*Writer->Context));
> -  AddUnresolvedSet(Data.VisibleConversions.get(*Writer->Context));
> +  Record->push_back(Data.ComputedVisibleConversions);
> +  if (Data.ComputedVisibleConversions)
> +    AddUnresolvedSet(Data.VisibleConversions.get(*Writer->Context));
>   // Data.Definition is the owning decl, no need to write it.
>   AddDeclRef(D->getFirstFriend());
> 
> 
> 
> _______________________________________________
> 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/20191010/afc0d711/attachment-0001.html>


More information about the cfe-commits mailing list