]> granicus.if.org Git - clang/commitdiff
Tweak USR generation to handle anonymous bitfields.
authorTed Kremenek <kremenek@apple.com>
Mon, 18 Jan 2010 22:02:49 +0000 (22:02 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 18 Jan 2010 22:02:49 +0000 (22:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93778 91177308-0d34-0410-b5e6-96231b3b80d8

tools/CIndex/CIndexUSRs.cpp

index c8933fa000e3d0ec82cae9c739acc82353ff405e..bd88ab44b83aef643153d798094ef064b549b67a 100644 (file)
@@ -70,12 +70,16 @@ static inline Program &GetProgram(CXIndex CIdx) {
 namespace {
 class USRGenerator : public DeclVisitor<USRGenerator> {
   llvm::raw_ostream &Out;
+  bool IgnoreResults;
 public:
-  USRGenerator(llvm::raw_ostream &out) : Out(out) {}
+  USRGenerator(llvm::raw_ostream &out) : Out(out), IgnoreResults(false) {}
+  
+  bool ignoreResults() const { return IgnoreResults; }
   
   void VisitBlockDecl(BlockDecl *D);
   void VisitDeclContext(DeclContext *D);
   void VisitEnumDecl(EnumDecl *D);
+  void VisitFieldDecl(FieldDecl *D);
   void VisitFunctionDecl(FunctionDecl *D);
   void VisitNamedDecl(NamedDecl *D);
   void VisitNamespaceDecl(NamespaceDecl *D);
@@ -105,6 +109,17 @@ void USRGenerator::VisitEnumDecl(EnumDecl *D) {
   VisitTagDeclCommon(D);
 }
 
+void USRGenerator::VisitFieldDecl(FieldDecl *D) {
+  const std::string &s = D->getNameAsString();
+  if (s.empty()) {
+    // Bit fields can be anonymous.
+    IgnoreResults = true;
+    return;
+  }
+  VisitDeclContext(D->getDeclContext());
+  Out << "@^FI^" << s;
+}
+
 void USRGenerator::VisitFunctionDecl(FunctionDecl *D) {
   VisitDeclContext(D->getDeclContext());
   Out << "@F^" << D->getNameAsString();
@@ -192,6 +207,8 @@ static CXString ConstructUSR(Decl *D) {
     llvm::raw_svector_ostream Out(StrBuf);
     USRGenerator UG(Out);
     UG.Visit(static_cast<Decl*>(D));
+    if (UG.ignoreResults())
+      return CIndexer::createCXString(NULL);
   }
   
   if (StrBuf.empty())