PR target/27650
authordannysmith <dannysmith@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Sep 2006 23:27:05 +0000 (23:27 +0000)
committerdannysmith <dannysmith@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Sep 2006 23:27:05 +0000 (23:27 +0000)
* class.c (check_for_override): Remove dllimport from virtual
methods.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117096 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c

index a5d403a..fed109f 100644 (file)
@@ -1,3 +1,9 @@
+2006-09-20  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       PR target/27650
+       * class.c (check_for_override): Remove dllimport from virtual
+       methods.
+
 2006-09-18  Steven Bosscher  <steven@gcc.gnu.org>
 
        PR c++/29087
index 7361b5a..fa11606 100644 (file)
@@ -2342,6 +2342,16 @@ check_for_override (tree decl, tree ctype)
       if (!DECL_VINDEX (decl))
        DECL_VINDEX (decl) = error_mark_node;
       IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1;
+      if (DECL_DLLIMPORT_P (decl))
+       {
+         /* When we handled the dllimport attribute we may not have known
+            that this function is virtual   We can't use dllimport
+            semantics for a virtual method because we need to initialize
+            the vtable entry with a constant address.  */
+         DECL_DLLIMPORT_P (decl) = 0;
+         DECL_ATTRIBUTES (decl)
+           = remove_attribute ("dllimport", DECL_ATTRIBUTES (decl));
+       }
     }
 }