Eric Wong wrote:
> According to the tcc (tiny C compiler) Changelog, tcc supports
> __attribute__ since 0.9.3.  Looking at history of tcc at
> <https://repo.or.cz/tinycc.git>, __attribute__ support was added
> in commit 14658993425878be300aae2e879560698e0c6c4c on 2002-01-03,
> which also looks like the release of 0.9.3.

Indeed, code like
  int foo (const char *s) __attribute__ ((__nonnull__ (1)));
compiles fine with the 4-years old tcc 0.9.27 release.

> I have copyright assignments on file with the FSF.

I see that you have a copyright assignment on file for GLIBC, but
not for GNULIB. But anyway, the change is so small that it does not
require a copyright assignment; see
<https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html>.

> diff --git a/lib/cdefs.h b/lib/cdefs.h
> index 2682c092f0..3bfb428511 100644
> --- a/lib/cdefs.h
> +++ b/lib/cdefs.h
> @@ -280,7 +280,7 @@
>  /* GCC and clang have various useful declarations that can be made with
>     the '__attribute__' syntax.  All of the ways we use this do fine if
>     they are omitted for compilers that don't understand it.  */
> -#if !(defined __GNUC__ || defined __clang__)
> +#if !(defined __GNUC__ || defined __clang__ || defined __TINYC__)
>  # define __attribute__(xyz)  /* Ignore */
>  #endif

I'm committing the attached patch, which includes a comment update,
in your name. Thanks!

Note that tcc (version 0.9.27) has some other problems that surface when
building Gnulib code:

1) Problems with 'extern inline'.

../gllib/libgnu.a: error: 'btoc32' defined twice
../gllib/libgnu.a: error: 'c32_apply_mapping' defined twice
../gllib/libgnu.a: error: 'c32_apply_type_test' defined twice
../gllib/libgnu.a: error: 'c32_get_mapping' defined twice
../gllib/libgnu.a: error: 'c32_get_type_test' defined twice
../gllib/libgnu.a: error: 'c32isalnum' defined twice
../gllib/libgnu.a: error: 'c32isalpha' defined twice
../gllib/libgnu.a: error: 'c32isblank' defined twice
../gllib/libgnu.a: error: 'c32iscntrl' defined twice
../gllib/libgnu.a: error: 'c32isdigit' defined twice
../gllib/libgnu.a: error: 'c32isgraph' defined twice
../gllib/libgnu.a: error: 'c32islower' defined twice
../gllib/libgnu.a: error: 'c32isprint' defined twice
../gllib/libgnu.a: error: 'c32ispunct' defined twice
../gllib/libgnu.a: error: 'c32isspace' defined twice
../gllib/libgnu.a: error: 'c32isupper' defined twice
../gllib/libgnu.a: error: 'c32isxdigit' defined twice
../gllib/libgnu.a: error: 'c32snrtombs' defined twice
../gllib/libgnu.a: error: 'c32srtombs' defined twice
../gllib/libgnu.a: error: 'c32stombs' defined twice
../gllib/libgnu.a: error: 'c32swidth' defined twice
../gllib/libgnu.a: error: 'c32tob' defined twice
../gllib/libgnu.a: error: 'c32tolower' defined twice
../gllib/libgnu.a: error: 'c32toupper' defined twice
../gllib/libgnu.a: error: 'c32width' defined twice
../gllib/libgnu.a: error: 'c_isalnum' defined twice
../gllib/libgnu.a: error: 'c_isalpha' defined twice
../gllib/libgnu.a: error: 'c_isascii' defined twice
../gllib/libgnu.a: error: 'c_isblank' defined twice
../gllib/libgnu.a: error: 'c_iscntrl' defined twice
../gllib/libgnu.a: error: 'c_isdigit' defined twice
../gllib/libgnu.a: error: 'c_isgraph' defined twice
../gllib/libgnu.a: error: 'c_islower' defined twice
../gllib/libgnu.a: error: 'c_isprint' defined twice
../gllib/libgnu.a: error: 'c_ispunct' defined twice
../gllib/libgnu.a: error: 'c_isspace' defined twice
../gllib/libgnu.a: error: 'c_isupper' defined twice
../gllib/libgnu.a: error: 'c_isxdigit' defined twice
../gllib/libgnu.a: error: 'c_tolower' defined twice
../gllib/libgnu.a: error: 'c_toupper' defined twice
../gllib/libgnu.a: error: 'get_handler' defined twice
../gllib/libgnu.a: error: 'get_stat_atime' defined twice
../gllib/libgnu.a: error: 'get_stat_atime_ns' defined twice
../gllib/libgnu.a: error: 'get_stat_birthtime' defined twice
../gllib/libgnu.a: error: 'get_stat_birthtime_ns' defined twice
../gllib/libgnu.a: error: 'get_stat_ctime' defined twice
../gllib/libgnu.a: error: 'get_stat_ctime_ns' defined twice
../gllib/libgnu.a: error: 'get_stat_mtime' defined twice
../gllib/libgnu.a: error: 'get_stat_mtime_ns' defined twice
../gllib/libgnu.a: error: '_gl_alloc_nomem' defined twice
../gllib/libgnu.a: error: 'gl_list_first_node' defined twice
../gllib/libgnu.a: error: 'gl_list_free' defined twice
../gllib/libgnu.a: error: 'gl_list_get_at' defined twice
../gllib/libgnu.a: error: 'gl_list_get_first' defined twice
../gllib/libgnu.a: error: 'gl_list_get_last' defined twice
../gllib/libgnu.a: error: 'gl_list_indexof' defined twice
../gllib/libgnu.a: error: 'gl_list_indexof_from' defined twice
../gllib/libgnu.a: error: 'gl_list_indexof_from_to' defined twice
../gllib/libgnu.a: error: 'gl_list_iterator' defined twice
../gllib/libgnu.a: error: 'gl_list_iterator_free' defined twice
../gllib/libgnu.a: error: 'gl_list_iterator_from_to' defined twice
../gllib/libgnu.a: error: 'gl_list_iterator_next' defined twice
../gllib/libgnu.a: error: 'gl_list_last_node' defined twice
../gllib/libgnu.a: error: 'gl_list_next_node' defined twice
../gllib/libgnu.a: error: 'gl_list_node_nx_set_value' defined twice
../gllib/libgnu.a: error: 'gl_list_node_value' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_add_after' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_add_at' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_add_before' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_add_first' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_add_last' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_create' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_create_empty' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_set_at' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_set_first' defined twice
../gllib/libgnu.a: error: 'gl_list_nx_set_last' defined twice
../gllib/libgnu.a: error: 'gl_list_previous_node' defined twice
../gllib/libgnu.a: error: 'gl_list_remove_at' defined twice
../gllib/libgnu.a: error: 'gl_list_remove' defined twice
../gllib/libgnu.a: error: 'gl_list_remove_first' defined twice
../gllib/libgnu.a: error: 'gl_list_remove_last' defined twice
../gllib/libgnu.a: error: 'gl_list_remove_node' defined twice
../gllib/libgnu.a: error: 'gl_list_search' defined twice
../gllib/libgnu.a: error: 'gl_list_search_from' defined twice
../gllib/libgnu.a: error: 'gl_list_search_from_to' defined twice
../gllib/libgnu.a: error: 'gl_list_size' defined twice
../gllib/libgnu.a: error: 'gl_map_free' defined twice
../gllib/libgnu.a: error: 'gl_map_get' defined twice
../gllib/libgnu.a: error: 'gl_map_getremove' defined twice
../gllib/libgnu.a: error: 'gl_map_iterator' defined twice
../gllib/libgnu.a: error: 'gl_map_iterator_free' defined twice
../gllib/libgnu.a: error: 'gl_map_iterator_next' defined twice
../gllib/libgnu.a: error: 'gl_map_nx_create_empty' defined twice
../gllib/libgnu.a: error: 'gl_map_nx_getput' defined twice
../gllib/libgnu.a: error: 'gl_map_nx_put' defined twice
../gllib/libgnu.a: error: 'gl_map_remove' defined twice
../gllib/libgnu.a: error: 'gl_map_search' defined twice
../gllib/libgnu.a: error: 'gl_map_size' defined twice
../gllib/libgnu.a: error: 'gl_omap_free' defined twice
../gllib/libgnu.a: error: 'gl_omap_get' defined twice
../gllib/libgnu.a: error: 'gl_omap_getremove' defined twice
../gllib/libgnu.a: error: 'gl_omap_iterator' defined twice
../gllib/libgnu.a: error: 'gl_omap_iterator_free' defined twice
../gllib/libgnu.a: error: 'gl_omap_iterator_next' defined twice
../gllib/libgnu.a: error: 'gl_omap_nx_create_empty' defined twice
../gllib/libgnu.a: error: 'gl_omap_nx_getput' defined twice
../gllib/libgnu.a: error: 'gl_omap_nx_put' defined twice
../gllib/libgnu.a: error: 'gl_omap_remove' defined twice
../gllib/libgnu.a: error: 'gl_omap_search_atleast' defined twice
../gllib/libgnu.a: error: 'gl_omap_search' defined twice
../gllib/libgnu.a: error: 'gl_omap_size' defined twice
../gllib/libgnu.a: error: 'gl_oset_free' defined twice
../gllib/libgnu.a: error: 'gl_oset_iterator_atleast' defined twice
../gllib/libgnu.a: error: 'gl_oset_iterator' defined twice
../gllib/libgnu.a: error: 'gl_oset_iterator_free' defined twice
../gllib/libgnu.a: error: 'gl_oset_iterator_next' defined twice
../gllib/libgnu.a: error: 'gl_oset_nx_add' defined twice
../gllib/libgnu.a: error: 'gl_oset_nx_create_empty' defined twice
../gllib/libgnu.a: error: 'gl_oset_remove' defined twice
../gllib/libgnu.a: error: 'gl_oset_search_atleast' defined twice
../gllib/libgnu.a: error: 'gl_oset_search' defined twice
../gllib/libgnu.a: error: 'gl_oset_size' defined twice
../gllib/libgnu.a: error: 'gl_oset_update' defined twice
../gllib/libgnu.a: error: 'gl_set_free' defined twice
../gllib/libgnu.a: error: 'gl_set_iterator' defined twice
../gllib/libgnu.a: error: 'gl_set_iterator_free' defined twice
../gllib/libgnu.a: error: 'gl_set_iterator_next' defined twice
../gllib/libgnu.a: error: '__gl_setmode' defined twice
../gllib/libgnu.a: error: 'gl_set_nx_add' defined twice
../gllib/libgnu.a: error: 'gl_set_nx_create_empty' defined twice
../gllib/libgnu.a: error: 'gl_set_remove' defined twice
../gllib/libgnu.a: error: 'gl_set_search' defined twice
../gllib/libgnu.a: error: 'gl_set_size' defined twice
../gllib/libgnu.a: error: 'gl_sortedlist_indexof' defined twice
../gllib/libgnu.a: error: 'gl_sortedlist_indexof_from_to' defined twice
../gllib/libgnu.a: error: 'gl_sortedlist_nx_add' defined twice
../gllib/libgnu.a: error: 'gl_sortedlist_remove' defined twice
../gllib/libgnu.a: error: 'gl_sortedlist_search' defined twice
../gllib/libgnu.a: error: 'gl_sortedlist_search_from_to' defined twice
../gllib/libgnu.a: error: 'icalloc' defined twice
../gllib/libgnu.a: error: 'imalloc' defined twice
../gllib/libgnu.a: error: 'ireallocarray' defined twice
../gllib/libgnu.a: error: 'irealloc' defined twice
../gllib/libgnu.a: error: 'lutimensat' defined twice
../gllib/libgnu.a: error: 'make_timespec' defined twice
../gllib/libgnu.a: error: 'mbsnrtoc32s' defined twice
../gllib/libgnu.a: error: 'mbsrtoc32s' defined twice
../gllib/libgnu.a: error: 'mbstoc32s' defined twice
../gllib/libgnu.a: error: 'mbszero' defined twice
../gllib/libgnu.a: error: 'mcel_ch' defined twice
../gllib/libgnu.a: error: 'mcel_cmp' defined twice
../gllib/libgnu.a: error: 'mcel_err' defined twice
../gllib/libgnu.a: error: 'mcel_isbasic' defined twice
../gllib/libgnu.a: error: 'mcel_scan' defined twice
../gllib/libgnu.a: error: 'mcel_scant' defined twice
../gllib/libgnu.a: error: 'mcel_scanz' defined twice
../gllib/libgnu.a: error: 'mcel_tocmp' defined twice
../gllib/libgnu.a: error: 'memeq' defined twice
../gllib/libgnu.a: error: 'psame_inode' defined twice
../gllib/libgnu.a: error: 'sd_c_casecmp' defined twice
../gllib/libgnu.a: error: 'sd_c' defined twice
../gllib/libgnu.a: error: 'sd_char_at' defined twice
../gllib/libgnu.a: error: 'sd_cmp' defined twice
../gllib/libgnu.a: error: 'sd_contains' defined twice
../gllib/libgnu.a: error: 'sd_copy' defined twice
../gllib/libgnu.a: error: 'sd_data' defined twice
../gllib/libgnu.a: error: 'sd_endswith' defined twice
../gllib/libgnu.a: error: 'sd_equals' defined twice
../gllib/libgnu.a: error: 'sd_fwrite' defined twice
../gllib/libgnu.a: error: 'sd_index' defined twice
../gllib/libgnu.a: error: 'sd_is_empty' defined twice
../gllib/libgnu.a: error: 'sd_last_index' defined twice
../gllib/libgnu.a: error: 'sd_length' defined twice
../gllib/libgnu.a: error: 'sd_overwrite' defined twice
../gllib/libgnu.a: error: 'sd_startswith' defined twice
../gllib/libgnu.a: error: 'sd_substring' defined twice
../gllib/libgnu.a: error: 'sd_write' defined twice
../gllib/libgnu.a: error: 'set_binary_mode' defined twice
../gllib/libgnu.a: error: 'stat_time_normalize' defined twice
../gllib/libgnu.a: error: 'streq' defined twice
../gllib/libgnu.a: error: 'timespec_cmp' defined twice
../gllib/libgnu.a: error: 'timespec_sign' defined twice
../gllib/libgnu.a: error: 'timespectod' defined twice
../gllib/libgnu.a: error: 'u64rol' defined twice
../gllib/libgnu.a: error: 'xmax' defined twice
../gllib/libgnu.a: error: 'xnrealloc' defined twice
../gllib/libgnu.a: error: 'xsd_c' defined twice
../gllib/libgnu.a: error: 'xsum3' defined twice
../gllib/libgnu.a: error: 'xsum4' defined twice
../gllib/libgnu.a: error: 'xsum' defined twice

2) ../../gltests/test-float-h.c:28: error: 'FLT_EVAL_METHOD' undeclared

3) ../../gltests/test-math-h.c:62: error: division by zero in constant

Bruno
>From 0ea13f65f029ff98d6aa7576883c2de961a1ebb2 Mon Sep 17 00:00:00 2001
From: Eric Wong <[email protected]>
Date: Thu, 30 Oct 2025 23:54:59 +0100
Subject: [PATCH] libc-config: Don't disable __attribute__ when compiling with
 Tiny C.

* lib/cdefs.h (__attribute__): Don't define to empty on Tiny C.

Copyright-paperwork-exempt: Yes
---
 ChangeLog   | 5 +++++
 lib/cdefs.h | 8 ++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b7f0310e00..a1881fa7ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2025-10-30  Eric Wong  <[email protected]>  (tiny change)
+
+	libc-config: Don't disable __attribute__ when compiling with Tiny C.
+	* lib/cdefs.h (__attribute__): Don't define to empty on Tiny C.
+
 2025-10-30  Bruno Haible  <[email protected]>
 
 	fprintftime: Avoid size_t overflow for very large outputs.
diff --git a/lib/cdefs.h b/lib/cdefs.h
index 2682c092f0..dce5739d23 100644
--- a/lib/cdefs.h
+++ b/lib/cdefs.h
@@ -277,10 +277,10 @@
 */
 #endif
 
-/* GCC and clang have various useful declarations that can be made with
-   the '__attribute__' syntax.  All of the ways we use this do fine if
-   they are omitted for compilers that don't understand it.  */
-#if !(defined __GNUC__ || defined __clang__)
+/* GCC, clang, and compatible compilers have various useful declarations
+   that can be made with the '__attribute__' syntax.  All of the ways we use
+   this do fine if they are omitted for compilers that don't understand it.  */
+#if !(defined __GNUC__ || defined __clang__ || defined __TINYC__)
 # define __attribute__(xyz)	/* Ignore */
 #endif
 
-- 
2.51.0

Reply via email to