From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27731 invoked by alias); 16 Dec 2001 23:46: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 27703 invoked by uid 71); 16 Dec 2001 23:46:00 -0000 Date: Sun, 16 Dec 2001 15:46:00 -0000 Message-ID: <20011216234600.27702.qmail@sources.redhat.com> To: paolo@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Peter Schmid Subject: Re: libstdc++/5133: Problems with toupper Reply-To: Peter Schmid X-SW-Source: 2001-12/txt/msg00930.txt.bz2 List-Id: The following reply was made to PR libstdc++/5133; it has been noted by GNATS. From: Peter Schmid To: paolo@gcc.gnu.org, gcc-bugs@gcc.gnu.org, gcc-prs@gcc.gnu.org, nobody@gcc.gnu.org, paolo@gcc.gnu.org, schmid@snake.iap.physik.tu-darmstadt.de, gcc-gnats@gcc.gnu.org Cc: Subject: Re: libstdc++/5133: Problems with toupper Date: Mon, 17 Dec 2001 00:39:53 +0100 (CET) On 16 Dec 2001 paolo@gcc.gnu.org wrote: > Synopsis: Problems with toupper > > Responsible-Changed-From-To: unassigned->paolo > Responsible-Changed-By: paolo > Responsible-Changed-When: Sun Dec 16 13:53:55 2001 > Responsible-Changed-Why: > Taking care of this. > State-Changed-From-To: open->feedback > State-Changed-By: paolo > State-Changed-When: Sun Dec 16 13:53:55 2001 > State-Changed-Why: > Hi Peter, > > in Josuttis, pp. 499 and 718 I find an explanation of what > is happening with your testcase. In a nutshell, tolower and > toupper are old C functions (you may use them through > cctype) whereas std::toupper(c, loc) (and the corresponding > tolower) are global functions of the C++ locales. > Therefore, your testcase should be changed to: > > #include > #include > #include > #include > > int main() > { > std::string s("Hallo"); > //std::transform (s.begin(), s.end(), s.begin(), std::tolower); > //std::transform (s.begin(), s.end(), s.begin(), ::tolower); > std::transform (s.begin(), s.end(), s.begin(), tolower); > std::cout << "lowered: " << s << std::endl; > } > > which indeed compiles and runs fine. > > Ok? > > Cheers, > Paolo. > > > > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5133 > It is IMHO not ok. If you consider the following source tl.C, a stripped down version from string/iter1.C from Josuttis, cf. pages number 497--499. Also cf. page number 720. I believe that this source code is legal and according to Josuttis the headers inject the corresponding <*.h> functions into the std namespace. Therefore, I have no idea why this code, the call to std::tolower is rejected. Additionally, why does the code compile if the iostream header is removed? Peter Schmid tl.C #include #include // does work, when this line is removed #include #include using namespace std; int main() { string s("Hallo"); transform (s.begin(), s.end(), s.begin(), tolower); transform (s.begin(), s.end(), s.begin(), ::tolower); } g++ -o tl tl.C -W -Wall tl.C: In function `int main()': tl.C:11: no matching function for call to `transform( std::__normal_iterator, std::allocator > >, std::__normal_iterator, std::allocator > >, std::__normal_iterator, std::allocator > >, )'