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