https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52953

Eric Gallager <egallager at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-08-19
                 CC|                            |egallager at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #3 from Eric Gallager <egallager at gcc dot gnu.org> ---
(In reply to meng from comment #0)
> source code demonstrating the problem.
> ------------------------------- BEGIN ----------------------------
> void f (int i) try
> {
>  void i (); // 1
> }
> catch (...)
> {
>  void i (); // 2
> }
> 
> int main ()
> {
>  return 0;
> }
> -------------------------------  END  ----------------------------
> 
> compiled with :
> $HOME/gcc/4.7.0/bin/c++ -std=c++0x -Wall -O3 tt.cc
> 
> compiler output : 
> nothing
> 
> g++-4.7.0 accepts the code as it is, issuing no warnings and no errors. I
> think this is wrong. According to c++11 3.3.3/2 
> "A parameter name shall not be redeclared in the outermost block of the
> function definition nor in the outermost block of any handler associated
> with a function-try-block."
> 
> In the above example, i is the name of the parameter of function f. The name
> i, therefore, cannot be redeclared in the outermost block of the function
> definition (case 1) nor can it be redeclared in the outermost block of any
> associated handler (case 2). But my g++ accepts both cases while they should
> be rejected.

I can get some other warnings from this but not what you want:

$ /usr/local/bin/g++ -c -std=c++0x -Wall -O3 -Wextra -Wshadow -pedantic
-Wmissing-declarations -Wredundant-decls 52953.c
52953.c:1:6: warning: no previous declaration for ‘void f(int)’
[-Wmissing-declarations]
 void f (int i) try
      ^
52953.c: In function ‘void f(int)’:
52953.c:1:13: warning: unused parameter ‘i’ [-Wunused-parameter]
 void f (int i) try
             ^
$

(In reply to meng from comment #1)
> another example showing violation of c++11 3.3.3/4
> ---------------------------- BEGIN -------------------------------
> int main ()
> {
>  if (int a = 1)
>  {
>   void a (); // 1
>  }
>  else
>  {
>   void a (); // 2
>  }
> 
>  while (int a = 0)
>  {
>   void a (); // 3
>  }
> 
>  for (int a = 0;;)
>  {
>   void a (); // 4
>   break;
>  }
>  for (; int a = 0;)
>  {
>   void a (); // 5
>  }
> 
>  return 0;
> }
> ----------------------------  END  -------------------------------
> 
> According to my understanding, all numbered cases are illegal based on c++11
> 3.3.3/4.g++-4.7.0 correctly caught case 3 and 5 as compiler errors, the rest
> are accepted.

Yup, 3 and 5 are still the only ones that error:

$ /usr/local/bin/g++ -c -std=c++0x -Wall -O3 -Wextra -Wshadow -pedantic
-Wmissing-declarations -Wredundant-decls 52953_2.c
52953_2.c: In function ‘int main()’:
52953_2.c:3:10: warning: unused variable ‘a’ [-Wunused-variable]
  if (int a = 1)
          ^
52953_2.c:14:11: error: ‘void a()’ redeclared as different kind of symbol
   void a (); // 3
           ^
52953_2.c:12:13: note: previous declaration ‘int a’
  while (int a = 0)
             ^
52953_2.c:12:13: warning: unused variable ‘a’ [-Wunused-variable]
52953_2.c:17:11: warning: unused variable ‘a’ [-Wunused-variable]
  for (int a = 0;;)
           ^
52953_2.c:24:11: error: ‘void a()’ redeclared as different kind of symbol
   void a (); // 5
           ^
52953_2.c:22:13: note: previous declaration ‘int a’
  for (; int a = 0;)
             ^
52953_2.c:22:13: warning: unused variable ‘a’ [-Wunused-variable]
$

So, confirmed.

Reply via email to