[LLVMbugs] [Bug 8035] New: Injected friend redefinition

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Aug 30 17:21:51 PDT 2010


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

           Summary: Injected friend redefinition
           Product: clang
           Version: trunk
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: ggreif at gmail.com
                CC: llvmbugs at cs.uiuc.edu, dgregor at apple.com


this is a stripped-down example from
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38392
which fails to compile on clang.


gabor at google8:~/llvm-build$ cat PR.cpp 
#include <cstdio>

void Function();

int main(int argc, char* argv[])
{
    Function();
}

template <typename T>
struct Test
{
    friend void Function() { printf("Function()"); getchar(); }
};

template class Test<int>;


gabor at google8:~/llvm-build$ /home/gabor/llvm-build/Debug+Asserts/bin/clang
PR.cpp
PR.cpp:13:17: error: redefinition of 'Function'
    friend void Function() { printf("Function()"); getchar(); }
                ^
PR.cpp:16:16: note: in instantiation of template class 'Test<int>' requested
here
template class Test<int>;
               ^
PR.cpp:13:17: note: previous definition is here
    friend void Function() { printf("Function()"); getchar(); }
                ^
1 error generated.


The error comes from

1175          // Check for a function body.
1176          const FunctionDecl *Definition = 0;
1177          if (Function->hasBody(Definition) &&
1178              Definition->getTemplateSpecializationKind() ==
TSK_Undeclared) {
1179            SemaRef.Diag(Function->getLocation(), diag::err_redefinition) 
1180              << Function->getDeclName();
1181            SemaRef.Diag(Definition->getLocation(),
diag::note_previous_definition);
1182            Function->setInvalidDecl();        
1183          } 

in clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

(I verified that the bug was present in r112000, before I started with fiddling
in clang.)

Modern gccs do compile this, but fail to link (see URL). gcc v4.6 should work.

-- 
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