This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/15774] New: Conflicting function decls not diagnosed


The C++ frontend doesn't always call targetm.compare_type_attributes
when comparing function decls in decl.c: decls_match.  As a result
conflicting decls are not diagnosed.  Here is a testcase.

/* stdcall.c */
extern void foo(int);

void bar() { foo(1);}

void __attribute__((stdcall)) foo(int i) {};

This should casue fatal error because of type conflict between
declaration and definition of foo.

In C it does.

D:\develop\bugs>gcc -S -Wall stdcall.c 
> stdcall.c:5: error: conflicting types for 'foo'
> stdcall.c:1: error: previous declaration of 'foo' was here

In C++ it doesn't

D:\develop\bugs>gcc -xc++ -S -Wall stdcall.c
compiles without error.

But it produces bad code.  This is easier to spot on windows targets because
of the target specific stdcall decoration.

        .file        "stdcall.c"
        .text
        .align 4
        .align 2
.globl __Z3barv
        .def        __Z3barv;        .scl        2;        .type        
32;        .endef
__Z3barv:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        subl        $12, %esp
        pushl        $1
        call        __Z3fooi   <<< undefined
        addl        $16, %esp  <<< Should be $12.
        leave
        ret
        .align 2
.globl __Z3fooi@4
        .def        __Z3fooi@4;        .scl        2;        .type        
32;        .endef
__Z3fooi@4:
        pushl        %ebp
        movl        %esp, %ebp
        leave
        ret        $4
        .def        __Z3fooi;        .scl        3;        .type        
32;        .endef


The testcase fails in 3.4.0 and 3.5.0 on i386-i386-pc-mingw32


The following patch to cp/declc fixes the testcase.  I don't think it is right, 
but I'll run it throw bootstrap and regtest and  submit proper patch if it 
doesn't cause any other problems.

Danny

Index: decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v
retrieving revision 1.1212
diff -c -3 -p -r1.1212 decl.c
*** decl.c	28 May 2004 21:58:15 -0000	1.1212
--- decl.c	2 Jun 2004 10:35:33 -0000
*************** decls_match (tree newdecl, tree olddecl)
*** 1021,1027 ****
  	    }
  #endif
  	  else
! 	    types_match = compparms (p1, p2);
  	}
        else
  	types_match = 0;
--- 1021,1030 ----
  	    }
  #endif
  	  else
! 	    types_match = compparms (p1, p2)
! 			  && comptypes (TREE_TYPE (newdecl),
! 					 TREE_TYPE (olddecl),
! 					 COMPARE_REDECLARATION);
  	}
        else
  	types_match = 0;

-- 
           Summary: Conflicting function decls not diagnosed
           Product: gcc
           Version: 3.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dannysmith at users dot sourceforge dot net
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i386-pc-mingw32
  GCC host triplet: i386-pc-mingw32
GCC target triplet: i386-pc-mingw32


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15774


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]