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
