From 74869a8523751c03db3264bcef72ade1c10bfa6a Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 30 Dec 2003 12:18:28 +0000 Subject: [PATCH] re PR c++/13507 (spurious printf format warning) cp: PR c++/13507 * decl.c (duplicate_decls): Use build_type_attribute_variant to merge attributes. testsuite: PR c++/13507 * g++.dg/ext/attrib11.C: New test. From-SVN: r75229 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/decl.c | 10 ++++++---- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/ext/attrib11.C | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/attrib11.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 15947ba7a3b..d56d24cc3ac 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2003-12-30 Nathan Sidwell + PR c++/13507 + * decl.c (duplicate_decls): Use build_type_attribute_variant to + merge attributes. + PR c++/13494 * tree.c (build_cplus_array_type_1): Only build a minimal array type for dependent types or domains. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 80041cb614d..c7a294d9b2f 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1262,10 +1262,12 @@ duplicate_decls (tree newdecl, tree olddecl) for anticipated built-ins, for exception lists, etc... */ else if (DECL_ANTICIPATED (olddecl)) { - TYPE_ATTRIBUTES (TREE_TYPE (newdecl)) - = (*targetm.merge_type_attributes) (TREE_TYPE (olddecl), - TREE_TYPE (newdecl)); - TREE_TYPE (olddecl) = TREE_TYPE (newdecl); + tree type = TREE_TYPE (newdecl); + tree attribs = (*targetm.merge_type_attributes) + (TREE_TYPE (olddecl), type); + + type = build_type_attribute_variant (type, attribs); + TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = type; } /* Whether or not the builtin can throw exceptions has no diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 992e6f4345a..d13331fdfd9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2003-12-30 Nathan Sidwell + PR c++/13507 + * g++.dg/ext/attrib11.C: New test. + PR c++/13494 * g++.dg/template/array2-1.C: New test. * g++.dg/template/array2-2.C: New test. diff --git a/gcc/testsuite/g++.dg/ext/attrib11.C b/gcc/testsuite/g++.dg/ext/attrib11.C new file mode 100644 index 00000000000..26bc7907c2e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib11.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Dec 2003 + + +// PR c++/13507, spurious warning due to attribute clobbering +extern "C" { + extern int printf (__const char *__restrict __format, ...) throw (); + extern int scanf (__const char *__restrict __format, ...) throw (); +} + +void foo(unsigned int x) +{ + printf ("%d\n", x); +} -- 2.30.2