On Jan 23, 2012, at 8:58 AM, Argyrios Kyrtzidis <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
