From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29256 invoked by alias); 13 Jul 2002 06:06:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 29242 invoked by uid 71); 13 Jul 2002 06:06:01 -0000 Date: Fri, 12 Jul 2002 23:06:00 -0000 Message-ID: <20020713060601.29241.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Rafal Dabrowa" Subject: Re: c++/7008: unexpected error message "var was not declared in this scope" Reply-To: "Rafal Dabrowa" X-SW-Source: 2002-07/txt/msg00412.txt.bz2 List-Id: The following reply was made to PR c++/7008; it has been noted by GNATS. From: "Rafal Dabrowa" To: , , , , Cc: Subject: Re: c++/7008: unexpected error message "var was not declared in this scope" Date: Sat, 13 Jul 2002 08:12:10 +0200 Gcc behaves inconsequently in this case. Consider the following code: void doit( int var ) { struct st { char s[sizeof(var)]; } zz; } int main() { doit(3); } This code compiles fine, even that var is a function argument, not a static/global variable. Now, we convert this function to a template: template void doit( T var ) { struct st { char s[sizeof(var)]; } zz; } int main() { doit(3); } Compiler complains in this case. Is it not strange ? It may be even worse. Consider we have a global varible named "var". In first case, compiler would take local variable. In second - global one. This inconsequence I treat as a compiler bug, which shall be corrected. Similar problem occurs when use constants. See code below. We have two functions with identical body, but the first one is an ordinary function, and the second one is a template. And compiler takes local N in first function, global N in second. This is not a correct behavior. -------------- code begin --------------- const int N = 500; void f(int var) { const int N = 5; struct { char str[N]; } zz; cout << "sizeof(zz) = " << sizeof(zz) << endl; } template void g(T var) { const int N = 5; struct { char str[N]; } zz; cout << "sizeof(zz) = " << sizeof(zz) << endl; } int main() { f(1); g(1); } -------------- code end --------------- With regards -- Rafal Dabrowa ----- Original Message ----- From: To: ; ; ; Sent: Thursday, July 11, 2002 4:39 PM Subject: Re: c++/7008: unexpected error message "var was not declared in this scope" > Synopsis: unexpected error message "var was not declared in this scope" > > State-Changed-From-To: open->closed > State-Changed-By: lerdsuwa > State-Changed-When: Thu Jul 11 07:39:20 2002 > State-Changed-Why: > Not a bug. According to the standard, section 9.8p1: > > Declarations in a local class can use only type names, > static variables, extern variables and functions, and > enumerators from the enclosing scope. > > The 'var' which is a function parameter is not allowed. > > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&p r=7008