[LLVMbugs] [Bug 13634] New: -Wdocumentation assertion when dealing with implicit instantiations of functions

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri Aug 17 16:23:36 PDT 2012


http://llvm.org/bugs/show_bug.cgi?id=13634

             Bug #: 13634
           Summary: -Wdocumentation assertion when dealing with implicit
                    instantiations of functions
           Product: clang
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: dgregor at apple.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified


terfin:clang dgregor$ cat t.cpp 

template<typename T>
struct X {
  /// \brief Blarg
  X(T) {}
};

void bar() {
  X<int> xi(5);
}

/// unattached

terfin:clang dgregor$ clang -Wdocumentation t.cpp 
Assertion failed: (DeclOrParsedComment.isNull()), function setDecl, file
/Users/dgregor/Projects/llvm/tools/clang/include/clang/AST/RawCommentList.h,
line 66.


The issue is, essentially, that the implicit instantiation picks up a comment
that is already associated with the member function from which it was
instantiated.

This little hack:

Index: lib/AST/ASTContext.cpp
===================================================================
--- lib/AST/ASTContext.cpp    (revision 161762)
+++ lib/AST/ASTContext.cpp    (working copy)
@@ -195,6 +195,12 @@
   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
     if (const FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
       D = FTD;
+    else if (FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
{
+      if (FD->isFunctionTemplateSpecialization())
+        D = FD->getPrimaryTemplate();
+      else if (FunctionDecl *MemFD = FD->getInstantiatedFromMemberFunction())
+        D = MemFD;
+    }
   } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
     if (const ClassTemplateDecl *CTD = RD->getDescribedClassTemplate())
       D = CTD;

Seems to fix the immediate problem, but there will likely also be issues with
class template specializations and instantiations, as well as enums and static
data members, so we need a more comprehensive approach.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list