[cfe-commits] r148708 - in /cfe/trunk: include/clang/AST/DeclCXX.h lib/AST/DeclCXX.cpp tools/libclang/IndexingContext.cpp
Douglas Gregor
dgregor at apple.com
Mon Jan 23 17:00:01 PST 2012
On Jan 23, 2012, at 8:58 AM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
> Author: akirtzidis
> Date: Mon Jan 23 10:58:45 2012
> New Revision: 148708
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148708&view=rev
> Log:
> Introduce CXXRecordDecl::isCLike() that is true if the class is C-like,
> without C++-specific features.
>
> Use it to set the language to C++ when indexing non-C-like structs.
> rdar://10732579
>
> Modified:
> cfe/trunk/include/clang/AST/DeclCXX.h
> cfe/trunk/lib/AST/DeclCXX.cpp
> cfe/trunk/tools/libclang/IndexingContext.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=148708&r1=148707&r2=148708&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
> +++ cfe/trunk/include/clang/AST/DeclCXX.h Mon Jan 23 10:58:45 2012
> @@ -348,6 +348,9 @@
> /// \brief True if this class (or any subobject) has mutable fields.
> bool HasMutableFields : 1;
>
> + /// \brief True if there no non-field members declared by the user.
> + bool HasOnlyFields : 1;
> +
> /// HasTrivialDefaultConstructor - True when, if this class has a default
> /// constructor, this default constructor is trivial.
> ///
> @@ -962,6 +965,10 @@
> /// user-defined destructor.
> bool isPOD() const { return data().PlainOldData; }
>
> + /// \brief True if this class is C-like, without C++-specific features, e.g.
> + /// it contains only public fields, no bases, tag kind is not 'class', etc.
> + bool isCLike() const;
> +
> /// isEmpty - Whether this class is empty (C++0x [meta.unary.prop]), which
> /// means it has a virtual function, virtual base, data member (other than
> /// 0-width bit-field) or inherits from a non-empty class. Does NOT include
>
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=148708&r1=148707&r2=148708&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Jan 23 10:58:45 2012
> @@ -43,7 +43,8 @@
> Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
> Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
> HasPrivateFields(false), HasProtectedFields(false), HasPublicFields(false),
> - HasMutableFields(false), HasTrivialDefaultConstructor(true),
> + HasMutableFields(false), HasOnlyFields(true),
> + HasTrivialDefaultConstructor(true),
> HasConstexprNonCopyMoveConstructor(false),
> DefaultedDefaultConstructorIsConstexpr(true),
> DefaultedCopyConstructorIsConstexpr(true),
> @@ -456,6 +457,9 @@
> }
>
> void CXXRecordDecl::addedMember(Decl *D) {
> + if (!isa<FieldDecl>(D) && !isa<IndirectFieldDecl>(D) && !D->isImplicit())
> + data().HasOnlyFields = false;
> +
> // Ignore friends and invalid declarations.
> if (D->getFriendObjectKind() || D->isInvalidDecl())
> return;
> @@ -957,6 +961,18 @@
> data().Conversions.addDecl(Shadow, Shadow->getAccess());
> }
>
> +bool CXXRecordDecl::isCLike() const {
> + if (getTagKind() == TTK_Class || !TemplateOrInstantiation.isNull())
> + return false;
> + if (!hasDefinition())
> + return true;
> +
> + return data().HasOnlyFields &&
> + !data().HasPrivateFields &&
> + !data().HasProtectedFields &&
> + !data().NumBases;
> +}
Don't you also want to check if it's a POD?
- Doug
> static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
> QualType T;
> if (isa<UsingShadowDecl>(Conv))
>
> Modified: cfe/trunk/tools/libclang/IndexingContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexingContext.cpp?rev=148708&r1=148707&r2=148708&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/IndexingContext.cpp (original)
> +++ cfe/trunk/tools/libclang/IndexingContext.cpp Mon Jan 23 10:58:45 2012
> @@ -814,12 +814,9 @@
> EntityInfo.kind = CXIdxEntity_Enum; break;
> }
>
> - if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) {
> - // FIXME: isPOD check is not sufficient, a POD can contain methods,
> - // we want a isCStructLike check.
> - if (CXXRec->hasDefinition() && !CXXRec->isPOD())
> + if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D))
> + if (!CXXRec->isCLike())
> EntityInfo.lang = CXIdxEntityLang_CXX;
> - }
>
> if (isa<ClassTemplatePartialSpecializationDecl>(D)) {
> EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list