[RFC] Ensure `wint_t' is defined before use in include/stdio.h

Message ID 20150512135420.GA53143@aloka.lostca.se
State Committed
Headers

Commit Message

Arjun Shankar May 12, 2015, 1:54 p.m. UTC
  While trying to get nptl/tst-initializers1.c to include the test skeleton, I
came across a couple of speed bumps. Firstly: after making the appropriate
changes to the test, running `make check' led to this error:

> In file included from ../malloc/malloc.h:24:0,
..
>                  from tst-initializers1.c:60:
> ../include/stdio.h:111:1: error: unknown type name `wint_t'
>  extern wint_t __getwc_unlocked (FILE *__fp);

So, `wint_t' is used before being defined. Question: Why did test-skeleton.c
not cause this error in any of the other tests that include it?

Anyway, I noticed include/stdio.h includes stddef.h, which in turn defines
`wint_t', but only if `__need_wint_t' is defined. So I put in a 
`#define __need_wint_t' before the include to get rid of the error. Is that
the correct fix?

A subsequent `make && make check' led to this second error:

>                  from tst-initializers1-c89.c:1:
> ../test-skeleton.c: In function `main':
> ../test-skeleton.c:356:11: error: `for' loop initial declarations are only
>  allowed in C99 mode
>            for (struct temp_name_list *n = temp_name_list;

Although there seem to be several other C89 no-noes in test-skeleton.c, I
needed only to fix this specific one for gcc-4.8.3 to stop complaining.

And finally: The attached patch was tested on x86_64 with no regressions.

ChangeLog:

2015-05-12  Arjun Shankar  <arjun.is@lostca.se>

	* include/stdio.h: Define __need_wint_t.
	* test-skeleton.c: Avoid `for' loop initial declaration.
	* Use test-skeleton.c.
---
 include/stdio.h          | 1 +
 nptl/tst-initializers1.c | 7 +++++--
 test-skeleton.c          | 3 ++-
 3 files changed, 8 insertions(+), 3 deletions(-)
  

Comments

Andreas Schwab May 12, 2015, 2:18 p.m. UTC | #1
Arjun Shankar <arjun.is@lostca.se> writes:

> So, `wint_t' is used before being defined. Question: Why did test-skeleton.c
> not cause this error in any of the other tests that include it?

They probably don't #undef _LIBC, or cause <stddef.h> to be included
before <stdio.h>.

Andreas.
  
Siddhesh Poyarekar May 13, 2015, 10 a.m. UTC | #2
On Tue, May 12, 2015 at 01:54:20PM +0000, Arjun Shankar wrote:
> While trying to get nptl/tst-initializers1.c to include the test skeleton, I
> came across a couple of speed bumps. Firstly: after making the appropriate
> changes to the test, running `make check' led to this error:
> 
> > In file included from ../malloc/malloc.h:24:0,
> ..
> >                  from tst-initializers1.c:60:
> > ../include/stdio.h:111:1: error: unknown type name `wint_t'
> >  extern wint_t __getwc_unlocked (FILE *__fp);
> 
> So, `wint_t' is used before being defined. Question: Why did test-skeleton.c
> not cause this error in any of the other tests that include it?
> 
> Anyway, I noticed include/stdio.h includes stddef.h, which in turn defines
> `wint_t', but only if `__need_wint_t' is defined. So I put in a 
> `#define __need_wint_t' before the include to get rid of the error. Is that
> the correct fix?
> 
> A subsequent `make && make check' led to this second error:
> 
> >                  from tst-initializers1-c89.c:1:
> > ../test-skeleton.c: In function `main':
> > ../test-skeleton.c:356:11: error: `for' loop initial declarations are only
> >  allowed in C99 mode
> >            for (struct temp_name_list *n = temp_name_list;
> 
> Although there seem to be several other C89 no-noes in test-skeleton.c, I
> needed only to fix this specific one for gcc-4.8.3 to stop complaining.
> 
> And finally: The attached patch was tested on x86_64 with no regressions.
> 
> ChangeLog:
> 
> 2015-05-12  Arjun Shankar  <arjun.is@lostca.se>
> 
> 	* include/stdio.h: Define __need_wint_t.
> 	* test-skeleton.c: Avoid `for' loop initial declaration.
> 	* Use test-skeleton.c.

Looks fine to me.  I wondered if modifying test-skeleton.c to allow it
to be built in c89 is worth it, but I concluded that it is fine.  I'll
commit this by the end of the week.

Siddhesh
  

Patch

diff --git a/include/stdio.h b/include/stdio.h
index 0010607..043b2b5 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -76,6 +76,7 @@  extern FILE *__old_tmpfile (void);
 
 
 #  define __need_size_t
+#  define __need_wint_t
 #  include <stddef.h>
 /* Generate a unique file name (and possibly open it).  */
 extern int __path_search (char *__tmpl, size_t __tmpl_len,
diff --git a/nptl/tst-initializers1.c b/nptl/tst-initializers1.c
index e09f7a9..5119ebf 100644
--- a/nptl/tst-initializers1.c
+++ b/nptl/tst-initializers1.c
@@ -30,8 +30,8 @@  pthread_rwlock_t rwl_writer
   = PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP;
 pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
 
-int
-main (void)
+static int
+do_test (void)
 {
   if (mtx_normal.__data.__kind != PTHREAD_MUTEX_TIMED_NP)
     return 1;
@@ -55,3 +55,6 @@  main (void)
       return 7;
   return 0;
 }
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/test-skeleton.c b/test-skeleton.c
index 43fc236..1332c94 100644
--- a/test-skeleton.c
+++ b/test-skeleton.c
@@ -352,8 +352,9 @@  main (int argc, char *argv[])
 
       if (temp_name_list != NULL)
         {
+          struct temp_name_list *n;
           fprintf (f, "temp_files=(\n");
-          for (struct temp_name_list *n = temp_name_list;
+          for (n = temp_name_list;
                n != NULL;
                n = (struct temp_name_list *) n->q.q_forw)
             fprintf (f, "  '%s'\n", n->name);