OSDN Git Service

PR target/27789
authordannysmith <dannysmith@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Jun 2006 08:25:33 +0000 (08:25 +0000)
committerdannysmith <dannysmith@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Jun 2006 08:25:33 +0000 (08:25 +0000)
* config/i386/winnt.c (ix86_handle_selectany_attribute): Move check
for initialization and setting of one_only flag to ...
(i386_pe_encode_section_info): ...here.
(i386_pe_dllimport_p): Check for DECL_DLLIMPORT_P also.
Recheck that the symbol has not been defined.

cp
* decl.c (start_decl): Check that dllimports are not initialized.

testsuite
* g++.dg/ext/dllimport4.C. Add more tests for invalid
initialization.

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

gcc/ChangeLog
gcc/config/i386/winnt.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/dllimport4.C

index 3960717..28eda6e 100644 (file)
@@ -1,3 +1,12 @@
+2006-06-23  Danny Smith   <dannysmith@users.sourceforge.net>
+
+       PR target/27789
+       * config/i386/winnt.c (ix86_handle_selectany_attribute): Move check
+       for initialization and setting of one_only flag to ...
+       (i386_pe_encode_section_info): ...here.
+       (i386_pe_dllimport_p): Check for DECL_DLLIMPORT_P also.
+       Recheck that the symbol has not been defined.
+
 2006-06-23  Richard Guenther  <rguenther@suse.de>
 
        * ggc-page.c (init_ggc): Do not round up the extra_order_size_table
@@ -26,6 +35,7 @@
        * reload1.c (gen_reload): Call mark_jump_label on the new insns
        generated by gen_move_insn to add REG_LABEL notes if necessary.
 
+>>>>>>> .r114926
 2006-06-22  Bob Wilson  <bob.wilson@acm.org>
 
        * config/xtensa/lib1funcs.asm (MIN_ESA): Delete.
index c7eae6c..a46fc5b 100644 (file)
@@ -1,7 +1,7 @@
 /* Subroutines for insn-output.c for Windows NT.
    Contributed by Douglas Rupp (drupp@cs.washington.edu)
-   Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-   Free Software Foundation, Inc.
+   Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006  Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -88,17 +88,10 @@ ix86_handle_selectany_attribute (tree *node, tree name,
                                 bool *no_add_attrs)
 {
   /* The attribute applies only to objects that are initialized and have
-     external linkage,  */     
-  if (TREE_CODE (*node) == VAR_DECL && TREE_PUBLIC (*node)
-      && (DECL_INITIAL (*node)
-          /* If an object is initialized with a ctor, the static
-            initialization and destruction code for it is present in
-            each unit defining the object.  The code that calls the
-            ctor is protected by a link-once guard variable, so that
-            the object still has link-once semantics,  */
-         || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (*node))))
-    make_decl_one_only (*node);
-  else
+     external linkage.  However, we may not know about initialization
+     until the language frontend has processed the decl. We'll check for
+     initialization later in encode_section_info.  */  
+  if (TREE_CODE (*node) != VAR_DECL || !TREE_PUBLIC (*node))
     {  
       error ("%qs attribute applies only to initialized variables"
                     " with external linkage",  IDENTIFIER_POINTER (name));
@@ -148,18 +141,28 @@ i386_pe_dllimport_p (tree decl)
        && TREE_CODE (decl) != FUNCTION_DECL)
     return false;
 
-  /* Lookup the attribute rather than rely on the DECL_DLLIMPORT_P flag.
+  /* Lookup the attribute in addition to checking the DECL_DLLIMPORT_P flag.
      We may need to override an earlier decision.  */
-  if (lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl)))
-    return true;
-
+  if (DECL_DLLIMPORT_P (decl)
+      && lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl)))
+    {
+       /* Make a final check to see if this is a definition before we generate
+          RTL for an indirect reference.  */   
+       if (!DECL_EXTERNAL (decl))
+       {
+         error ("%q+D: definition is marked as dllimport", decl);
+         DECL_DLLIMPORT_P (decl) = 0;
+          return false;
+        }
+      return true;
+    }
   /* The DECL_DLLIMPORT_P flag was set for decls in the class definition
      by  targetm.cxx.adjust_class_at_definition.  Check again to emit
      warnings if the class attribute has been overridden by an
      out-of-class definition.  */
-  if (associated_type (decl)
-      && lookup_attribute ("dllimport",
-                           TYPE_ATTRIBUTES (associated_type (decl))))
+  else if (associated_type (decl)
+           && lookup_attribute ("dllimport",
+                               TYPE_ATTRIBUTES (associated_type (decl))))
     return i386_pe_type_dllimport_p (decl);
 
   return false;
@@ -362,6 +365,22 @@ i386_pe_encode_section_info (tree decl, rtx rtl, int first)
        }
     }
 
+  else if (TREE_CODE (decl) == VAR_DECL
+           && lookup_attribute ("selectany", DECL_ATTRIBUTES (decl)))
+    {
+      if (DECL_INITIAL (decl)
+         /* If an object is initialized with a ctor, the static
+            initialization and destruction code for it is present in
+            each unit defining the object.  The code that calls the
+            ctor is protected by a link-once guard variable, so that
+            the object still has link-once semantics,  */
+          || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
+       make_decl_one_only (decl);
+      else
+       error ("%q+D:'selectany' attribute applies only to initialized objects",
+              decl);
+    }
+
   /* Mark the decl so we can tell from the rtl whether the object is
      dllexport'd or dllimport'd.  tree.c: merge_dllimport_decl_attributes
      handles dllexport/dllimport override semantics.  */
index fcea368..30c66d3 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-23  Danny Smith   <dannysmith@users.sourceforge.net>
+
+       PR target/27789
+       * decl.c (start_decl): Check that dllimports are not initialized.
+
 2006-06-22  Lee Millward  <lee.millward@gmail.com>
 
        PR c++/27805
index 5bb61cb..e3c9297 100644 (file)
@@ -3873,6 +3873,16 @@ start_decl (const cp_declarator *declarator,
   /* Set attributes here so if duplicate decl, will have proper attributes.  */
   cplus_decl_attributes (&decl, attributes, 0);
 
+  /* Dllimported symbols cannot be defined.  Static data members (which
+     can be initialized in-class and dllimported) go through grokfield,
+     not here, so we don't need to exclude those decls when checking for
+     a definition.  */
+  if (initialized && DECL_DLLIMPORT_P (decl))
+    {
+      error ("definition of %q#D is marked %<dllimport%>", decl);
+      DECL_DLLIMPORT_P (decl) = 0;
+    }
+
   /* If #pragma weak was used, mark the decl weak now.  */
   maybe_apply_pragma_weak (decl);
 
index f0a68e5..b9204ec 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-23  Danny Smith   <dannysmith@users.sourceforge.net>
+
+       PR target/27789
+       * g++.dg/ext/dllimport4.C. Add more tests for invalid
+       initialization.
+
 2006-06-22  Roger Sayle  <roger@eyesopen.com>
 
        PR target/27531
index f61773b..2baa944 100644 (file)
@@ -4,3 +4,35 @@
 __attribute__((dllimport))  void bar () { }    // { dg-error "definition" }
 
 __attribute__((dllimport))  int foo = 1;       // { dg-error "definition" }
+
+void faz()
+{
+  __attribute__((dllimport)) int faa = 1;      // { dg-error "definition" }
+  faa++; 
+}
+
+__attribute__((dllimport)) int fee (1);                // { dg-error "definition" }
+
+
+// In-class initialization of a static data member is not a definition.  
+struct  F
+{
+  __attribute__ ((dllimport)) static const int i = 1;  // OK
+};
+
+// Reference the dllimport'd static data member.
+void f ()
+{
+  const int* j = &F::i;
+}
+
+struct  G
+{
+  __attribute__ ((dllimport)) static const int i = 1;
+};
+
+// Define the static data member _without_ the dllimport.
+// This should override the prior declaration with dllimport.
+
+const int G::i;                //  { dg-warning "dllimport ignored" }
+