Message ID | 20150512135420.GA53143@aloka.lostca.se |
---|---|
State | New |
Headers | show |
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.
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
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);