2002-08-06 Aldy Hernandez * c-decl.c (duplicate_decls): Error out for incompatible TLS declarations. * testsuite/gcc.dg/tls/diag-3.c: New. *** gcc/c-decl.c 1 Aug 2002 06:20:30 -0000 1.344 --- gcc/c-decl.c 7 Aug 2002 01:01:55 -0000 *************** duplicate_decls (newdecl, olddecl, diffe *** 1673,1678 **** --- 1673,1692 ---- if (TREE_CODE (newdecl) == VAR_DECL) DECL_INITIAL (newdecl) = 0; } + /* TLS cannot follow non-TLS declaration. */ + else if (TREE_CODE (olddecl) == VAR_DECL && TREE_CODE (newdecl) == VAR_DECL + && !DECL_THREAD_LOCAL (olddecl) && DECL_THREAD_LOCAL (newdecl)) + { + error_with_decl (newdecl, "thread-local declaration of `%s' follows non thread-local declaration"); + error_with_decl (olddecl, "previous declaration of `%s'"); + } + /* non-TLS declaration cannot follow TLS declaration. */ + else if (TREE_CODE (olddecl) == VAR_DECL && TREE_CODE (newdecl) == VAR_DECL + && DECL_THREAD_LOCAL (olddecl) && !DECL_THREAD_LOCAL (newdecl)) + { + error_with_decl (newdecl, "non thread-local declaration of `%s' follows thread-local declaration"); + error_with_decl (olddecl, "previous declaration of `%s'"); + } else { errmsg = redeclaration_error_message (newdecl, olddecl); *** gcc/testsuite/gcc.dg/tls/diag-3.c 1 Jan 1970 00:00:00 -0000 --- gcc/testsuite/gcc.dg/tls/diag-3.c 7 Aug 2002 01:01:55 -0000 *************** *** 0 **** --- 1,10 ---- + /* Report invalid extern and __thread combinations. */ + + extern int j; /* { dg-error "previous declaration" } */ + __thread int j; /* { dg-error "thread-local declaration" } */ + + extern __thread int i; /* { dg-error "previous declaration" } */ + int i; /* { dg-error "non thread-local" } */ + + extern __thread int k; /* This is fine. */ + __thread int k;