aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Smith <dannysmith@users.sourceforge.net>2007-09-25 00:29:42 +0000
committerDanny Smith <dannysmith@gcc.gnu.org>2007-09-25 00:29:42 +0000
commit18ff3013c2600a5138fbd51d5a90af1d3101ce1d (patch)
tree0cb7e4ad382ef40b1366d5f251d6999479bde0ac
parent2e104885214d399548cd5742e5b818cd63c02dbf (diff)
downloadgcc-18ff3013c2600a5138fbd51d5a90af1d3101ce1d.zip
gcc-18ff3013c2600a5138fbd51d5a90af1d3101ce1d.tar.gz
gcc-18ff3013c2600a5138fbd51d5a90af1d3101ce1d.tar.bz2
re PR c++/14688 (Mis-matched calling convention on virtual functions accepted without error)
PR c++/14688 * config/i386/i386.c (ix86_comp_type_attributes): Check METHOD_TYPE too. cp * search.c (check_final_overrider): Fail if targetm.comp_type_attributes returns 0. testsuite * g++.dg/inherit/override_attribs.C: New file. From-SVN: r128740
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c4
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/search.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/inherit/override-attribs.C22
6 files changed, 53 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c1376d4..07b24d7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-24 Danny Smith <dannysmith@user.sourceforge.net>
+
+ PR c++/14688
+ * config/i386/i386.c (ix86_comp_type_attributes): Check
+ METHOD_TYPE too.
+
2007-09-24 Roman Zippel <zippel@linux-m68k.org>
* 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 c01bcbb..a9ca27b 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 6950166..0effc4b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-24 Danny Smith <dannysmith@user.sourceforge.net>
+
+ PR c++/14688
+ * search.c (check_final_overrider): Fail if
+ targetm.comp_type_attributes returns 0.
+
+
2007-09-24 Jason Merrill <jason@redhat.com>
PR c++/33239
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 4371eb4..13e252e 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 f4da1dd..6caa3205 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-24 Danny Smith <dannysmith@user.sourceforge.net>
+
+ PR c++/14688
+ * g++.dg/inherit/override_attribs.C: New file.
+
2007-09-23 Tobias Schlüter <tobi@gcc.gnu.org>
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 0000000..44a1ea4
--- /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
+};