re PR c++/34749 (Incorrect warning when applying dllimport to friend function)
authorDanny Smith <dannysmith@users.sourceforge.net>
Sun, 24 Feb 2008 09:19:39 +0000 (09:19 +0000)
committerDanny Smith <dannysmith@gcc.gnu.org>
Sun, 24 Feb 2008 09:19:39 +0000 (09:19 +0000)
cp
PR c++/34749
* friend.c (do_friend): Call cplus_decl_attributes earlier.

testsuite
PR c++/34749
* g++.dg.ext/dllimport13.C: New test.

From-SVN: r132585

gcc/cp/ChangeLog
gcc/cp/friend.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/dllimport13.C [new file with mode: 0644]

index 19709c10920403c4302c19645797f3ca9f450115..68f9a7badd100cd2126f85bfcb5bb2d2ba5e3d1f 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-24  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       PR c++/34749
+       * friend.c (do_friend): Call cplus_decl_attributes earlier.
+
 2008-02-22  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR C++/34715
index ffb0baaa60031902c633c65edd43920486cd7db4..c4dfcc58798ae4decaf977cddd3586b5b6562e53 100644 (file)
@@ -413,6 +413,13 @@ do_friend (tree ctype, tree declarator, tree decl,
   /* Every decl that gets here is a friend of something.  */
   DECL_FRIEND_P (decl) = 1;
 
+  /* Unfortunately, we have to handle attributes here.  Normally we would
+     handle them in start_decl_1, but since this is a friend decl start_decl_1
+     never gets to see it.  */
+
+  /* Set attributes here so if duplicate decl, will have proper attributes.  */
+  cplus_decl_attributes (&decl, attrlist, 0);
+
   if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
     {
       declarator = TREE_OPERAND (declarator, 0);
@@ -582,12 +589,5 @@ do_friend (tree ctype, tree declarator, tree decl,
       DECL_FRIEND_P (decl) = 1;
     }
 
-  /* Unfortunately, we have to handle attributes here.  Normally we would
-     handle them in start_decl_1, but since this is a friend decl start_decl_1
-     never gets to see it.  */
-
-  /* Set attributes here so if duplicate decl, will have proper attributes.  */
-  cplus_decl_attributes (&decl, attrlist, 0);
-
   return decl;
 }
index 62ab6a818795a42187bcb3b0b85ed31617f75707..b5f5a89e975e8db80596a41db60d2c249caaa3a1 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-24  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       PR c++/34749
+       * g++.dg.ext/dllimport13.C: New test.
+
 2008-02-23  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR libfortran/24685
diff --git a/gcc/testsuite/g++.dg/ext/dllimport13.C b/gcc/testsuite/g++.dg/ext/dllimport13.C
new file mode 100644 (file)
index 0000000..a0d4ab5
--- /dev/null
@@ -0,0 +1,14 @@
+//  PR c++/34749
+//  Ensure dllimport is handled correctly for friends
+
+// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} }
+
+int  __declspec (dllimport) bar();
+int  __declspec (dllimport) baz();
+
+class Foo
+{
+//  MS requires that the dllimport attribute be specified on each declaration 
+    friend  int __declspec (dllimport) bar();
+    friend int  baz();  //  { dg-warning "dllimport ignored" }
+};