[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