On 2007-01-29, Akim Demaille <akim(a)lrde.epita.fr> wrote:
>>
"BP" == Benoit Perrot <benoit(a)lrde.epita.fr> writes:
Heummmm ... Par pure curiosité : je peux
demander pourquoi ? :)
(On compterais le maintenir ? ;)
Je pensais qu'il y avait un problème de portabilité, mais c'était un
problème de distcc. Comme il est utilisé par tc et vaucanson, ça
méritait son propre dépôt. De toutes façons les warnings commencent à
me souler, si qq'1 pouvait s'en charger, ce serait cool.
Je viens de regarder vite fait et y'a pas grand chose à faire... en
fait y'a un endroit où ils utilisent des unsigned char* et après ils
font des strlen/strncmp dessus et GCC se plaint que ça diffère en
signedness, et le reste c'est des arguments non utilisés qui
déclenchent un warning malgré l'utilisation visiblement correctement
de __attribute__ ((__unused__)).
Après une rapide investigation, il s'avère que leur test pendant leur
configure pour vérifier si le compilo gère les __attribute__ est b0rken:
configure:20502: checking for __attribute__
configure:20538: gcc -c -g -O2 conftest.c >&5
conftest.c: In function 'main':
conftest.c:33: error: invalid storage class for function 'foo'
conftest.c:37: error: invalid storage class for function 'foo'
configure:20544: $? = 1
configure: failed program was:
| /* confdefs.h. */
| [SNIP pleins de #define PACKAGE_* et HAVE_*_H]
| /* end confdefs.h. */
|
| #include <stdlib.h>
|
| int
| main ()
| {
|
| static void foo(void) __attribute__ ((noreturn));
|
| static void __attribute__ ((noreturn))
| foo(void)
| {
| exit(1);
| }
|
| ;
| return 0;
| }
configure:20559: result: no
En testant à la mano, ce code compile si le code est en dehors du main.
On peut virer une partie des warnings en corrigeant le test du
configure.
Voilà un patch pour corriger le problème:
Index: argp/acinclude.m4
===================================================================
--- argp/acinclude.m4 (revision 2508)
+++ argp/acinclude.m4 (working copy)
@@ -282,10 +282,8 @@
AC_DEFUN([LSH_GCC_ATTRIBUTES],
[AC_CACHE_CHECK(for __attribute__,
lsh_cv_c_attribute,
-[ AC_TRY_COMPILE([
+[ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include <stdlib.h>
-],
-[
static void foo(void) __attribute__ ((noreturn));
static void __attribute__ ((noreturn))
@@ -293,9 +291,10 @@
{
exit(1);
}
-],
-lsh_cv_c_attribute=yes,
-lsh_cv_c_attribute=no)])
+]])],
+ [lsh_cv_c_attribute=yes],
+ [lsh_cv_c_attribute=no])
+])
AH_TEMPLATE([HAVE_GCC_ATTRIBUTE], [Define if the compiler understands __attribute__])
if test "x$lsh_cv_c_attribute" = "xyes"; then
Je l'applique dans tc ou dans le repos dédié à argp? En fait ça
devrait peut-être même remonter chez les mainteneurs de la glibc... Je
comprends pas comment ça pouvait détecter quoique ce soit leur truc.
Peut-être que GCC autorisait les nested functions sans le mot clé
``auto'' avant. En tout cas c'est plus le cas sur un GCC récent.
--
SIGOURE Benoit aka Tsuna (SUSv3 compliant)
_____ "On a long enough timeline, the survival rate
/EPITA\ Promo 2008.CSI/ACU/YAKA for everyone drops to zero" -- Jack.