This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/15774] New: Conflicting function decls not diagnosed
- From: "dannysmith at users dot sourceforge dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 2 Jun 2004 10:54:14 -0000
- Subject: [Bug c++/15774] New: Conflicting function decls not diagnosed
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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