diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1376d44472..07b24d72baa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-09-24 Danny Smith + + PR c++/14688 + * config/i386/i386.c (ix86_comp_type_attributes): Check + METHOD_TYPE too. + 2007-09-24 Roman Zippel * config/m68k/m68k.h (ASM_OUTPUT_ALIGN_WITH_NOP): New, use diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c01bcbb32e1..a9ca27b5e02 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3118,7 +3118,8 @@ ix86_comp_type_attributes (const_tree type1, const_tree type2) /* Check for mismatch of non-default calling convention. */ const char *const rtdstr = TARGET_RTD ? "cdecl" : "stdcall"; - if (TREE_CODE (type1) != FUNCTION_TYPE) + if (TREE_CODE (type1) != FUNCTION_TYPE + && TREE_CODE (type1) != METHOD_TYPE) return 1; /* Check for mismatched fastcall/regparm types. */ @@ -7839,6 +7840,7 @@ get_dllimport_decl (tree decl) set_mem_alias_set (rtl, ix86_GOT_alias_set ()); SET_DECL_RTL (to, rtl); + SET_DECL_ASSEMBLER_NAME (to, get_identifier (name)); return to; } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6950166f13a..0effc4bc2a5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2007-09-24 Danny Smith + + PR c++/14688 + * search.c (check_final_overrider): Fail if + targetm.comp_type_attributes returns 0. + + 2007-09-24 Jason Merrill PR c++/33239 diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 4371eb4358e..13e252edd9f 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see #include "rtl.h" #include "output.h" #include "toplev.h" +#include "target.h" static int is_subobject_of_p (tree, tree); static tree dfs_lookup_base (tree, void *); @@ -1901,6 +1902,15 @@ check_final_overrider (tree overrider, tree basefn) return 0; } + /* Check for conflicting type attributes. */ + if (!targetm.comp_type_attributes (over_type, base_type)) + { + error ("conflicting type attributes specified for %q+#D", overrider); + error (" overriding %q+#D", basefn); + DECL_INVALID_OVERRIDER_P (overrider) = 1; + return 0; + } + return 1; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4da1ddf0a2..6caa3205cb6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-24 Danny Smith + + PR c++/14688 + * g++.dg/inherit/override_attribs.C: New file. + 2007-09-23 Tobias Schlüter PR fortran/33269 diff --git a/gcc/testsuite/g++.dg/inherit/override-attribs.C b/gcc/testsuite/g++.dg/inherit/override-attribs.C new file mode 100644 index 00000000000..44a1ea49734 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/override-attribs.C @@ -0,0 +1,22 @@ +// PR c++/14688 +// { dg-do compile { target i?86-*-* } } +class one +{ +public: + virtual void + test(void* value); // { dg-error "overriding" } +}; + +class two : public one +{ +public: + void __attribute__((regparm(2))) + test(void* value); // { dg-error "conflicting type attributes" } +}; + +class three : public one +{ +public: + void __attribute__ ((cdecl)) + test(void* value); // OK +};