2010-12-25 Kai Tietz <kai.tietz@onevision.com>
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Dec 2010 10:41:05 +0000 (10:41 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Dec 2010 10:41:05 +0000 (10:41 +0000)
PR c++/15774
* decl.c (decls_match): Check for FUNCTION_DECL
also for identity of compatible attributes.

ChangeLog gcc/testsuite

2010-12-25  Kai Tietz  <kai.tietz@onevision.com>

PR c++/15774
* g++.dg/warn/pr15774-1.C: New test.
* g++.dg/warn/pr15774-2.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/pr15774-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/pr15774-2.C [new file with mode: 0644]

index 5bdfa43..09e4353 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-25  Kai Tietz  <kai.tietz@onevision.com>
+
+       PR c++/15774
+       * decl.c (decls_match): Check for FUNCTION_DECL
+       also for identity of compatible attributes.
+
 2010-12-22  Nathan Froyd  <froydnj@codesourcery.com>
 
        * decl.c (decls_match, duplicate_decls): Use prototype_p.
index f74b0c2..f7bf1bf 100644 (file)
@@ -1009,7 +1009,11 @@ decls_match (tree newdecl, tree olddecl)
            }
 #endif
          else
-           types_match = compparms (p1, p2);
+           types_match =
+             compparms (p1, p2)
+             && (TYPE_ATTRIBUTES (TREE_TYPE (newdecl)) == NULL_TREE
+                 || targetm.comp_type_attributes (TREE_TYPE (newdecl),
+                                                  TREE_TYPE (olddecl)) != 0);
        }
       else
        types_match = 0;
index 2f07ea6..db09e39 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-25  Kai Tietz  <kai.tietz@onevision.com>
+
+       PR c++/15774
+       * g++.dg/warn/pr15774-1.C: New test.
+       * g++.dg/warn/pr15774-2.C: New test.
+
 2010-12-24  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc.dg/gnu-api-2-sel.m: Test calling sel_getUid,
diff --git a/gcc/testsuite/g++.dg/warn/pr15774-1.C b/gcc/testsuite/g++.dg/warn/pr15774-1.C
new file mode 100644 (file)
index 0000000..efd4dae
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// Test that an new declartion with different attributes then old one fail.
+extern void foo (int); // { dg-error "ambiguates old declaration" }
+
+void
+bar (void)
+{
+  foo (1);
+}
+
+void __attribute__((stdcall)) foo (int i) // { dg-error "new declaration" }
+{
+}
+
+
diff --git a/gcc/testsuite/g++.dg/warn/pr15774-2.C b/gcc/testsuite/g++.dg/warn/pr15774-2.C
new file mode 100644 (file)
index 0000000..f890b7a
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
+// Test that old declaration is used, if new one has no attributes.
+extern void __attribute__((stdcall)) foo (int);
+
+void
+bar (void)
+{
+  foo (1);
+}
+
+void foo (int i)
+{
+}
+
+