From 7d3b509adae17f526dad2929ae2b16183408401d Mon Sep 17 00:00:00 2001
From: jsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 2 Oct 2001 07:12:25 +0000
Subject: 	* attribs.c (decl_attributes): Possibly call 
 insert_default_attributes to insert default attributes on 	functions in a
 lazy manner. 	* builtin-attrs.def: New file; define the default format and 
 format_arg attributes. 	* c-common.c (c_format_attribute_table): Move
 to earlier in the 	file. 	(c_common_nodes_and_builtins): Initialize
 format_attribute_table. 	(enum built_in_attribute, built_in_attributes,
 	c_attrs_initialized, c_init_attributes, 
 c_common_insert_default_attributes): New. 	(c_common_lang_init): Don't
 initialize format_attribute_table.  Do 	call c_init_attributes. 
 * Makefile.in (c-common.o): Depend on builtin-attrs.def. 	* c-common.h
 (init_function_format_info): Don't declare. 
 (c_common_insert_default_attributes): Declare. 	* c-decl.c
 (implicitly_declare, builtin_function): Call 	decl_attributes. 
 (init_decl_processing): Don't call init_function_format_info. 
 (insert_default_attributes): New. 	* c-format.c (handle_format_attribute,
 	handle_format_arg_attribute): Be quiet about inappropriate 
 declaration when applying default attributes. 	(init_function_format_info):
 Remove. 	* tree.h (enum attribute_flags): Add ATTR_FLAG_BUILT_IN. 
 (insert_default_attributes): Declare.

cp:
	* decl.c (init_decl_processing): Don't call
	init_function_format_info.  Initialize lang_attribute_table
	earlier.
	(builtin_function): Call decl_attributes.
	(insert_default_attributes): New.

testsuite:
	* gcc.dg/format/attr-5.c, gcc.dg/format/attr-6.c: New tests.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45942 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/builtin-attrs.def | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 166 insertions(+)
 create mode 100644 gcc/builtin-attrs.def

(limited to 'gcc/builtin-attrs.def')

diff --git a/gcc/builtin-attrs.def b/gcc/builtin-attrs.def
new file mode 100644
index 00000000000..de98501cf36
--- /dev/null
+++ b/gcc/builtin-attrs.def
@@ -0,0 +1,166 @@
+/* Copyright (C) 2001 Free Software Foundation, Inc.
+   Contributed by Joseph Myers <jsm28@cam.ac.uk>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
+
+/* This header provides a declarative way of describing the attributes
+   that are applied to some functions by default.
+
+   Before including this header, you must define the following macros.
+   In each case where there is an ENUM, it is an identifier used to
+   reference the tree in subsequent definitions.
+
+   DEF_ATTR_NULL_TREE (ENUM)
+
+     Constructs a NULL_TREE.
+
+   DEF_ATTR_INT (ENUM, VALUE)
+
+     Constructs an INTEGER_CST with value VALUE (an integer representable
+     in HOST_WIDE_INT).
+
+   DEF_ATTR_IDENT (ENUM, STRING)
+
+     Constructs an IDENTIFIER_NODE for STRING.
+
+   DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN)
+
+     Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given
+     as previous ENUM names).
+
+   DEF_FN_ATTR (NAME, ATTRS, PREDICATE)
+
+     Specifies that the function with name NAME (a previous ENUM for an
+     IDENTIFIER_NODE) has attributes ATTRS (a previous ENUM) if
+     PREDICATE is true.  */
+
+DEF_ATTR_NULL_TREE (ATTR_NULL)
+
+/* Note that below we must avoid whitespace in arguments of CONCAT*.  */
+
+/* Construct a tree for a given integer and a list containing it.  */
+#define DEF_ATTR_FOR_INT(VALUE)					\
+  DEF_ATTR_INT (CONCAT2 (ATTR_,VALUE), VALUE)			\
+  DEF_ATTR_TREE_LIST (CONCAT2 (ATTR_LIST_,VALUE), ATTR_NULL,	\
+		      CONCAT2 (ATTR_,VALUE), ATTR_NULL)
+DEF_ATTR_FOR_INT (0)
+DEF_ATTR_FOR_INT (1)
+DEF_ATTR_FOR_INT (2)
+DEF_ATTR_FOR_INT (3)
+DEF_ATTR_FOR_INT (4)
+#undef DEF_ATTR_FOR_INT
+
+/* Construct a tree for a list of two integers.  */
+#define DEF_LIST_INT_INT(VALUE1, VALUE2)				 \
+  DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_LIST_,VALUE1,_,VALUE2), ATTR_NULL,	 \
+		    CONCAT2 (ATTR_,VALUE1), CONCAT2 (ATTR_LIST_,VALUE2))
+DEF_LIST_INT_INT (1,0)
+DEF_LIST_INT_INT (1,2)
+DEF_LIST_INT_INT (2,0)
+DEF_LIST_INT_INT (2,3)
+DEF_LIST_INT_INT (3,0)
+DEF_LIST_INT_INT (3,4)
+#undef DEF_LIST_INT_INT
+
+DEF_ATTR_IDENT (ATTR_PRINTF, "printf")
+DEF_ATTR_IDENT (ATTR_SCANF, "scanf")
+DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
+DEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")
+
+DEF_ATTR_IDENT (ATTR_FORMAT, "format")
+DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
+
+/* Construct a tree for a format attribute.  */
+#define DEF_FORMAT_ATTRIBUTE(TYPE, VALUES)				 \
+  DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_,TYPE,_,VALUES), ATTR_NULL,		 \
+		      CONCAT2 (ATTR_,TYPE), CONCAT2 (ATTR_LIST_,VALUES)) \
+  DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_FORMAT_,TYPE,_,VALUES), ATTR_FORMAT, \
+		      CONCAT4 (ATTR_,TYPE,_,VALUES), ATTR_NULL)
+DEF_FORMAT_ATTRIBUTE(PRINTF,1_0)
+DEF_FORMAT_ATTRIBUTE(PRINTF,1_2)
+DEF_FORMAT_ATTRIBUTE(PRINTF,2_0)
+DEF_FORMAT_ATTRIBUTE(PRINTF,2_3)
+DEF_FORMAT_ATTRIBUTE(PRINTF,3_0)
+DEF_FORMAT_ATTRIBUTE(PRINTF,3_4)
+DEF_FORMAT_ATTRIBUTE(SCANF,1_0)
+DEF_FORMAT_ATTRIBUTE(SCANF,1_2)
+DEF_FORMAT_ATTRIBUTE(SCANF,2_0)
+DEF_FORMAT_ATTRIBUTE(SCANF,2_3)
+DEF_FORMAT_ATTRIBUTE(STRFTIME,3_0)
+DEF_FORMAT_ATTRIBUTE(STRFMON,3_4)
+#undef DEF_FORMAT_ATTRIBUTE
+
+DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_1, ATTR_FORMAT_ARG, ATTR_LIST_1, ATTR_NULL)
+DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_2, ATTR_FORMAT_ARG, ATTR_LIST_2, ATTR_NULL)
+
+/* Define an attribute for a function, along with the IDENTIFIER_NODE.  */
+#define DEF_FN_ATTR_IDENT(NAME, ATTRS, PREDICATE)	\
+  DEF_ATTR_IDENT (CONCAT2(ATTR_,NAME), STRINGX(NAME))	\
+  DEF_FN_ATTR (CONCAT2(ATTR_,NAME), ATTRS, PREDICATE)
+
+/* The ISO C functions are always checked (whether <stdio.h> is
+   included or not), since it is common to call printf without
+   including <stdio.h>.  There shouldn't be a problem with this,
+   since ISO C reserves these function names whether you include the
+   header file or not.  In any case, the checking is harmless.  With
+   -ffreestanding, these default attributes are disabled, and must be
+   specified manually if desired.  */
+
+/* __builtin functions should be checked unconditionally, even with
+   -ffreestanding.  */
+DEF_FN_ATTR_IDENT (__builtin_printf, ATTR_FORMAT_PRINTF_1_2, true)
+DEF_FN_ATTR_IDENT (__builtin_fprintf, ATTR_FORMAT_PRINTF_2_3, true)
+
+/* Functions from ISO/IEC 9899:1990.  */
+#define DEF_C89_ATTR(NAME, ATTRS) DEF_FN_ATTR_IDENT (NAME, ATTRS, flag_hosted)
+DEF_C89_ATTR (printf, ATTR_FORMAT_PRINTF_1_2)
+DEF_C89_ATTR (fprintf, ATTR_FORMAT_PRINTF_2_3)
+DEF_C89_ATTR (sprintf, ATTR_FORMAT_PRINTF_2_3)
+DEF_C89_ATTR (scanf, ATTR_FORMAT_SCANF_1_2)
+DEF_C89_ATTR (fscanf, ATTR_FORMAT_SCANF_2_3)
+DEF_C89_ATTR (sscanf, ATTR_FORMAT_SCANF_2_3)
+DEF_C89_ATTR (vprintf, ATTR_FORMAT_PRINTF_1_0)
+DEF_C89_ATTR (vfprintf, ATTR_FORMAT_PRINTF_2_0)
+DEF_C89_ATTR (vsprintf, ATTR_FORMAT_PRINTF_2_0)
+DEF_C89_ATTR (strftime, ATTR_FORMAT_STRFTIME_3_0)
+#undef DEF_C89_ATTR
+
+/* ISO C99 adds the snprintf and vscanf family functions.  */
+#define DEF_C99_ATTR(NAME, ATTRS)					    \
+  DEF_FN_ATTR_IDENT (NAME, ATTRS,					    \
+	       (flag_hosted						    \
+		&& (flag_isoc99 || flag_noniso_default_format_attributes)))
+DEF_C99_ATTR (snprintf, ATTR_FORMAT_PRINTF_3_4)
+DEF_C99_ATTR (vsnprintf, ATTR_FORMAT_PRINTF_3_0)
+DEF_C99_ATTR (vscanf, ATTR_FORMAT_SCANF_1_0)
+DEF_C99_ATTR (vfscanf, ATTR_FORMAT_SCANF_2_0)
+DEF_C99_ATTR (vsscanf, ATTR_FORMAT_SCANF_2_0)
+#undef DEF_C99_ATTR
+
+/* Functions not in any version of ISO C.  */
+#define DEF_EXT_ATTR(NAME, ATTRS)					\
+  DEF_FN_ATTR_IDENT (NAME, ATTRS,					\
+	       flag_hosted && flag_noniso_default_format_attributes)
+/* Uniforum/GNU gettext functions.  */
+DEF_EXT_ATTR (gettext, ATTR_FORMAT_ARG_1)
+DEF_EXT_ATTR (dgettext, ATTR_FORMAT_ARG_2)
+DEF_EXT_ATTR (dcgettext, ATTR_FORMAT_ARG_2)
+/* X/Open strfmon function.  */
+DEF_EXT_ATTR (strfmon, ATTR_FORMAT_STRFMON_3_4)
+#undef DEF_EXT_ATTR
+#undef DEF_FN_ATTR_IDENT
-- 
cgit v1.2.1

