diff mbox

[1/2] PR c++/53322 - -Wunused-local-typedefs is not enabled by Wall or Wunused

Message ID m3d35xfxna.fsf@redhat.com
State New
Headers show

Commit Message

Dodji Seketeli May 21, 2012, 1:53 p.m. UTC
Hello,

As the audit trail of this shows, -Wunused-local-typedefs is not
turned on by -Wunused after all.  Sigh.

Now that we have the EnabledBy construct for the *.opt files, it's
more precise and concise to use that to make -Wunused-local-typedefs
be triggered by -Wunused.

I have changed the gcc+.dg/warn/Wunused-local-typedefs.C test case to
make it use -Wunused instead of -Wunused-local-typedefs.  I had to
adjust it to avoid the warnings due to the other -W* options triggered
by -Wunused there.

While testing the compiler, it turned out that some local typedefs
were not being used when the experimental "Concepts" support is turned
off, in the libstdc++ test suite.  I also had to remove some obvious
useless local typedef usage in the fortran front-end.  Fixed thus.

Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.

gcc/c-family/

	PR c++/53322
	* c.opt (Wunused-local-typedefs): Use EnabledBy(Wunused).

libstdc++-v3/

	PR c++/53322
	* include/bits/stl_algobase.h (lower_bound)
	(lexicographical_compare): Do not declare unused local typedefs
	here when Concepts are turned off.

gcc/fortran/

	PR c++/53322
	* f95-lang.c (gfc_init_builtin_functions): Remove the unused
	typedef builtin_type.

gcc/testsuite/

	PR c++/53322
	* g++.dg/warn/Wunused-local-typedefs.C: Adjust to use -Wunused
	instead of -Wunused-local-typedefs.
---
 gcc/c-family/c.opt                                 |    2 +-
 gcc/fortran/f95-lang.c                             |    1 -
 gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C |   16 ++++++++--------
 libstdc++-v3/include/bits/stl_algobase.h           |    4 ++++
 4 files changed, 13 insertions(+), 10 deletions(-)

Comments

Jason Merrill May 21, 2012, 3 p.m. UTC | #1
On 05/21/2012 09:53 AM, Dodji Seketeli wrote:
> I have changed the gcc+.dg/warn/Wunused-local-typedefs.C test case to
> make it use -Wunused instead of -Wunused-local-typedefs.  I had to
> adjust it to avoid the warnings due to the other -W* options triggered
> by -Wunused there.

Hmm, I might have added another test to make sure that -Wunused enables 
-Wunused-local-typedefs rather than scatter attribute ((unused)) all 
around this one, but I guess this way is fine too.

The patch is OK.

Jason
diff mbox

Patch

diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 53d9752..0b72d79 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -671,7 +671,7 @@  C ObjC Var(warn_unsuffixed_float_constants) Warning
 Warn about unsuffixed float constants
 
 Wunused-local-typedefs
-C ObjC C++ ObjC++ Var(warn_unused_local_typedefs) Warning
+C ObjC C++ ObjC++ Var(warn_unused_local_typedefs) Warning EnabledBy(Wunused)
 Warn when typedefs locally defined in a function are not used
 
 Wunused-macros
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c
index 3f0c303..7250ca2 100644
--- a/gcc/fortran/f95-lang.c
+++ b/gcc/fortran/f95-lang.c
@@ -641,7 +641,6 @@  gfc_init_builtin_functions (void)
 #undef DEF_POINTER_TYPE
     BT_LAST
   };
-  typedef enum builtin_type builtin_type;
 
   tree mfunc_float[6];
   tree mfunc_double[6];
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C b/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C
index 87feb52..4fc8640 100644
--- a/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C
+++ b/gcc/testsuite/g++.dg/warn/Wunused-local-typedefs.C
@@ -1,5 +1,5 @@ 
 // Origin PR c++/33255
-// { dg-options "-Wunused-local-typedefs" }
+// { dg-options "-Wunused" } <-- should trigger -Wunused-local-typedefs
 // { dg-do compile }
 
 void
@@ -59,7 +59,7 @@  test3_tmpl(void)
 {
     typedef struct ST<int> foo;
     ST<int> v;
-    const foo &var = v;
+    const foo __attribute__((unused))&var = v;
 }
 
 void
@@ -72,7 +72,7 @@  void
 test4(void)
 {
   typedef int foo;
-  int vec[1] = {sizeof (foo)};
+  int __attribute__((unused))vec[1] = {sizeof (foo)};
 }
 
 void
@@ -87,11 +87,11 @@  test5(void)
   typedef C0 T4;
 
   int v0 = (T0) 2;
-  char v1 = static_cast<T1> (0);
-  reinterpret_cast<T2> (&v0);
+  char __attribute__((unused)) v1 = static_cast<T1> (0);
+  if (reinterpret_cast<T2> (&v0));
   unsigned* const c = 0;
-  unsigned* v2 = const_cast<T3* const> (c);
-  C0 *p0 = 0;
+  unsigned* __attribute__((unused))v2 = const_cast<T3* const> (c);
+  C0 *__attribute__((unused))p0 = 0;
   C1 *p1 = 0;
   p0 = dynamic_cast<T4*> (p1);  
 }
@@ -101,7 +101,7 @@  test6(void)
 {
   struct C0 {};
   typedef C0 foo;
-  C0 *v = new foo;
+  C0 *__attribute__((unused))v = new foo;
 }
 
 template<class T, class U>
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index a48cf9a..fe30f6c 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -944,8 +944,10 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     lower_bound(_ForwardIterator __first, _ForwardIterator __last,
 		const _Tp& __val)
     {
+#ifdef _GLIBCXX_CONCEPT_CHECKS
       typedef typename iterator_traits<_ForwardIterator>::value_type
 	_ValueType;
+#endif
       typedef typename iterator_traits<_ForwardIterator>::difference_type
 	_DistanceType;
 
@@ -1083,9 +1085,11 @@  _GLIBCXX_BEGIN_NAMESPACE_ALGO
     lexicographical_compare(_II1 __first1, _II1 __last1,
 			    _II2 __first2, _II2 __last2)
     {
+#ifdef _GLIBCXX_CONCEPT_CHECKS
       // concept requirements
       typedef typename iterator_traits<_II1>::value_type _ValueType1;
       typedef typename iterator_traits<_II2>::value_type _ValueType2;
+#endif
       __glibcxx_function_requires(_InputIteratorConcept<_II1>)
       __glibcxx_function_requires(_InputIteratorConcept<_II2>)
       __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)