From 3f01be2d6d4ccb92a7ad25a0ca33fe0d2684b716 Mon Sep 17 00:00:00 2001 From: No Author Date: Thu, 16 May 2002 02:09:36 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'gcc-3_1-branch'. From-SVN: r53502 --- gcc/testsuite/g++.dg/init/pm1.C | 88 +++++ .../testsuite/22_locale/ctype_scan_char.cc | 348 +++++++++++++++++ .../testsuite/22_locale/ctype_scan_wchar_t.cc | 355 ++++++++++++++++++ 3 files changed, 791 insertions(+) create mode 100644 gcc/testsuite/g++.dg/init/pm1.C create mode 100644 libstdc++-v3/testsuite/22_locale/ctype_scan_char.cc create mode 100644 libstdc++-v3/testsuite/22_locale/ctype_scan_wchar_t.cc diff --git a/gcc/testsuite/g++.dg/init/pm1.C b/gcc/testsuite/g++.dg/init/pm1.C new file mode 100644 index 000000000000..c0aed241086b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm1.C @@ -0,0 +1,88 @@ +// { dg-do run } + +// Copyright 2002 Free Software Foundation +// Contributed by Jason Merrill and Alexandre Oliva + +// Test zero-initialization of pointers to data members. Their NULL +// value is represented with -1, not 0. + +#include + +struct A +{ + int i; +}; + +int A::* gp; + +typedef int A::* iApm; + +iApm gp_zero = 0; +iApm gp_dflt = iApm(); +iApm gp_cast = (iApm)0; +iApm gp_func = iApm(0); +iApm gp_stat = static_cast(0); + +struct AD : A {}; + +int AD::* gp_impl = gp_dflt; +int AD::* gp_down = static_cast(gp_stat); + +int A::* ga[2]; + +// Test use in a simple struct. +struct B +{ + int A::* mp; +}; + +B gb; + +struct D; +struct C; +extern D gd; +extern C gc; + +// Test that in a class with a constructor, the pointer to member is +// zero-initialized until the constructor is run. +struct C +{ + int A::* mp; + inline C (); +}; + +int fail; +struct D +{ + int count; + inline D (); +}; + +C::C() : mp (&A::i) { gd.count++; } + +D::D() : count (0) +{ + if (gc.mp != 0) + abort (); +} + +// The D must come first for this to work. +D gd; +C gc; + +int main() +{ + static int A::* slp; + static int A::* sla[2]; + static B slb; + + if (gp != 0 || slp != 0 + || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0 + || gp_func != 0 || gp_stat != 0 + || gp_impl != 0 || gp_down != 0) + abort (); + if (ga[1] != 0 || sla[1] != 0) + abort (); + if (gb.mp != 0 || slb.mp != 0) + abort (); +} diff --git a/libstdc++-v3/testsuite/22_locale/ctype_scan_char.cc b/libstdc++-v3/testsuite/22_locale/ctype_scan_char.cc new file mode 100644 index 000000000000..6e8d1d31e26b --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/ctype_scan_char.cc @@ -0,0 +1,348 @@ +// 2002-05-10 ghazi + +// Copyright (C) 2002 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +// { dg-do run } + +#include +#include + +typedef char char_type; +typedef std::char_traits traits_type; +class gnu_ctype: public std::ctype { }; + +// These two macros take a ctype mask, a string and a pointer within +// the string that the scan function should return, usually either the +// first or last character if the string contains identical values as +// below. +#define VERIFY_SCAN_IS(MASK, STRING, EXPECTED) \ + VERIFY(gctype.scan_is((MASK), (STRING), \ + (STRING) + traits_type::length(STRING)) == (EXPECTED)) +#define VERIFY_SCAN_NOT(MASK, STRING, EXPECTED) \ + VERIFY(gctype.scan_not((MASK), (STRING), \ + (STRING) + traits_type::length(STRING)) == (EXPECTED)) + +// Sanity check scan_is() and scan_not(). +void test01() +{ + bool test = true; + + const char_type *const ca = "aaaaa"; + const char_type *const cz = "zzzzz"; + const char_type *const cA = "AAAAA"; + const char_type *const cZ = "ZZZZZ"; + const char_type *const c0 = "00000"; + const char_type *const c9 = "99999"; + const char_type *const cs = " "; + const char_type *const xf = "fffff"; + const char_type *const xF = "FFFFF"; + const char_type *const p1 = "!!!!!"; + const char_type *const p2 = "/////"; + + gnu_ctype gctype; + + // 'a' + VERIFY_SCAN_IS (std::ctype_base::alnum, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::alpha, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::cntrl, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::digit, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::graph, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::lower, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::print, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::punct, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::space, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::upper, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, ca, ca); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::digit, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::graph, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::print, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::space, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::upper, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, ca, ca+5); + + // 'z' + VERIFY_SCAN_IS (std::ctype_base::alnum, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::alpha, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::lower, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::print, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::punct, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::space, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::upper, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cz, cz+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::digit, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::graph, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::print, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::space, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::upper, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cz, cz); + + // 'A' + VERIFY_SCAN_IS (std::ctype_base::alnum, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::alpha, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::lower, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::print, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::punct, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::space, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::upper, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cA, cA); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::digit, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::graph, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::print, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::space, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::upper, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cA, cA+5); + + // 'Z' + VERIFY_SCAN_IS (std::ctype_base::alnum, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::alpha, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::lower, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::print, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::punct, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::space, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::upper, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cZ, cZ+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::digit, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::graph, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::print, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::space, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::upper, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cZ, cZ); + + // '0' + VERIFY_SCAN_IS (std::ctype_base::alnum, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::alpha, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::digit, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::graph, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::lower, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::print, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::punct, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::space, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::upper, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, c0, c0); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::digit, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::graph, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::print, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::space, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::upper, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, c0, c0+5); + + // '9' + VERIFY_SCAN_IS (std::ctype_base::alnum, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::alpha, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::digit, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::graph, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::lower, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::print, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::punct, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::space, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::upper, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, c9, c9); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::digit, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::graph, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::print, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::space, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::upper, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, c9, c9+5); + + // ' ' + VERIFY_SCAN_IS (std::ctype_base::alnum, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::alpha, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::lower, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::print, cs, cs); + VERIFY_SCAN_IS (std::ctype_base::punct, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::space, cs, cs); + VERIFY_SCAN_IS (std::ctype_base::upper, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cs, cs+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::digit, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::graph, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::lower, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::print, cs, cs+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::space, cs, cs+5); + VERIFY_SCAN_NOT (std::ctype_base::upper, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cs, cs); + + // 'f' + VERIFY_SCAN_IS (std::ctype_base::alnum, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::alpha, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::cntrl, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::digit, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::graph, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::lower, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::print, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::punct, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::space, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::upper, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, xf, xf); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::digit, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::graph, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::print, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::space, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::upper, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, xf, xf+5); + + // 'F' + VERIFY_SCAN_IS (std::ctype_base::alnum, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::alpha, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::cntrl, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::digit, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::graph, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::lower, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::print, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::punct, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::space, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::upper, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::xdigit, xF, xF); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::digit, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::graph, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::print, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::space, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::upper, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, xF, xF+5); + + // '!' + VERIFY_SCAN_IS (std::ctype_base::alnum, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::alpha, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::digit, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::graph, p1, p1); + VERIFY_SCAN_IS (std::ctype_base::lower, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::print, p1, p1); + VERIFY_SCAN_IS (std::ctype_base::punct, p1, p1); + VERIFY_SCAN_IS (std::ctype_base::space, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::upper, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, p1, p1+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::alpha, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::digit, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::lower, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::print, p1, p1+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, p1, p1+5); + VERIFY_SCAN_NOT (std::ctype_base::space, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::upper, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, p1, p1); + + // '/' + VERIFY_SCAN_IS (std::ctype_base::alnum, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::alpha, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::digit, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::graph, p2, p2); + VERIFY_SCAN_IS (std::ctype_base::lower, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::print, p2, p2); + VERIFY_SCAN_IS (std::ctype_base::punct, p2, p2); + VERIFY_SCAN_IS (std::ctype_base::space, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::upper, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, p2, p2+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::alpha, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::digit, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::graph, p2, p2+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::print, p2, p2+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, p2, p2+5); + VERIFY_SCAN_NOT (std::ctype_base::space, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::upper, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, p2, p2); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/22_locale/ctype_scan_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/ctype_scan_wchar_t.cc new file mode 100644 index 000000000000..96ee9ae6d4ce --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/ctype_scan_wchar_t.cc @@ -0,0 +1,355 @@ +// 2002-05-10 ghazi + +// Copyright (C) 2002 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +// { dg-do run } + +#include +#include + +// XXX This test is not working for non-glibc locale models. +// { dg-do run { xfail *-*-* } } + +typedef wchar_t char_type; +typedef std::char_traits traits_type; +class gnu_ctype: public std::ctype { }; + +// These two macros take a ctype mask, a string and a pointer within +// the string that the scan function should return, usually either the +// first or last character if the string contains identical values as +// below. +#define VERIFY_SCAN_IS(MASK, STRING, EXPECTED) \ + VERIFY(gctype.scan_is((MASK), (STRING), \ + (STRING) + traits_type::length(STRING)) == (EXPECTED)) +#define VERIFY_SCAN_NOT(MASK, STRING, EXPECTED) \ + VERIFY(gctype.scan_not((MASK), (STRING), \ + (STRING) + traits_type::length(STRING)) == (EXPECTED)) + +#ifdef _GLIBCPP_USE_WCHAR_T +// Sanity check scan_is() and scan_not(). +void test01() +{ + bool test = true; + + const char_type *const ca = L"aaaaa"; + const char_type *const cz = L"zzzzz"; + const char_type *const cA = L"AAAAA"; + const char_type *const cZ = L"ZZZZZ"; + const char_type *const c0 = L"00000"; + const char_type *const c9 = L"99999"; + const char_type *const cs = L" "; + const char_type *const xf = L"fffff"; + const char_type *const xF = L"FFFFF"; + const char_type *const p1 = L"!!!!!"; + const char_type *const p2 = L"/////"; + + gnu_ctype gctype; + + // 'a' + VERIFY_SCAN_IS (std::ctype_base::alnum, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::alpha, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::cntrl, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::digit, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::graph, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::lower, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::print, ca, ca); + VERIFY_SCAN_IS (std::ctype_base::punct, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::space, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::upper, ca, ca+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, ca, ca); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::digit, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::graph, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::print, ca, ca+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::space, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::upper, ca, ca); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, ca, ca+5); + + // 'z' + VERIFY_SCAN_IS (std::ctype_base::alnum, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::alpha, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::lower, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::print, cz, cz); + VERIFY_SCAN_IS (std::ctype_base::punct, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::space, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::upper, cz, cz+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cz, cz+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::digit, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::graph, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::print, cz, cz+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::space, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::upper, cz, cz); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cz, cz); + + // 'A' + VERIFY_SCAN_IS (std::ctype_base::alnum, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::alpha, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::lower, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::print, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::punct, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::space, cA, cA+5); + VERIFY_SCAN_IS (std::ctype_base::upper, cA, cA); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cA, cA); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::digit, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::graph, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::print, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::space, cA, cA); + VERIFY_SCAN_NOT (std::ctype_base::upper, cA, cA+5); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cA, cA+5); + + // 'Z' + VERIFY_SCAN_IS (std::ctype_base::alnum, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::alpha, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::lower, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::print, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::punct, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::space, cZ, cZ+5); + VERIFY_SCAN_IS (std::ctype_base::upper, cZ, cZ); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cZ, cZ+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::digit, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::graph, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::print, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::space, cZ, cZ); + VERIFY_SCAN_NOT (std::ctype_base::upper, cZ, cZ+5); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cZ, cZ); + + // '0' + VERIFY_SCAN_IS (std::ctype_base::alnum, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::alpha, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::digit, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::graph, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::lower, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::print, c0, c0); + VERIFY_SCAN_IS (std::ctype_base::punct, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::space, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::upper, c0, c0+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, c0, c0); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::digit, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::graph, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::print, c0, c0+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::space, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::upper, c0, c0); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, c0, c0+5); + + // '9' + VERIFY_SCAN_IS (std::ctype_base::alnum, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::alpha, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::digit, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::graph, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::lower, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::print, c9, c9); + VERIFY_SCAN_IS (std::ctype_base::punct, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::space, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::upper, c9, c9+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, c9, c9); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::digit, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::graph, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::print, c9, c9+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::space, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::upper, c9, c9); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, c9, c9+5); + + // ' ' + VERIFY_SCAN_IS (std::ctype_base::alnum, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::alpha, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::digit, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::graph, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::lower, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::print, cs, cs); + VERIFY_SCAN_IS (std::ctype_base::punct, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::space, cs, cs); + VERIFY_SCAN_IS (std::ctype_base::upper, cs, cs+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, cs, cs+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::alpha, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::digit, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::graph, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::lower, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::print, cs, cs+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::space, cs, cs+5); + VERIFY_SCAN_NOT (std::ctype_base::upper, cs, cs); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, cs, cs); + + // 'f' + VERIFY_SCAN_IS (std::ctype_base::alnum, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::alpha, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::cntrl, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::digit, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::graph, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::lower, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::print, xf, xf); + VERIFY_SCAN_IS (std::ctype_base::punct, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::space, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::upper, xf, xf+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, xf, xf); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::digit, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::graph, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::print, xf, xf+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::space, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::upper, xf, xf); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, xf, xf+5); + + // 'F' + VERIFY_SCAN_IS (std::ctype_base::alnum, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::alpha, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::cntrl, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::digit, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::graph, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::lower, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::print, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::punct, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::space, xF, xF+5); + VERIFY_SCAN_IS (std::ctype_base::upper, xF, xF); + VERIFY_SCAN_IS (std::ctype_base::xdigit, xF, xF); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::alpha, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::digit, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::graph, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::print, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::space, xF, xF); + VERIFY_SCAN_NOT (std::ctype_base::upper, xF, xF+5); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, xF, xF+5); + + // '!' + VERIFY_SCAN_IS (std::ctype_base::alnum, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::alpha, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::digit, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::graph, p1, p1); + VERIFY_SCAN_IS (std::ctype_base::lower, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::print, p1, p1); + VERIFY_SCAN_IS (std::ctype_base::punct, p1, p1); + VERIFY_SCAN_IS (std::ctype_base::space, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::upper, p1, p1+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, p1, p1+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::alpha, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::digit, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::lower, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::print, p1, p1+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, p1, p1+5); + VERIFY_SCAN_NOT (std::ctype_base::space, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::upper, p1, p1); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, p1, p1); + + // '/' + VERIFY_SCAN_IS (std::ctype_base::alnum, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::alpha, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::cntrl, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::digit, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::graph, p2, p2); + VERIFY_SCAN_IS (std::ctype_base::lower, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::print, p2, p2); + VERIFY_SCAN_IS (std::ctype_base::punct, p2, p2); + VERIFY_SCAN_IS (std::ctype_base::space, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::upper, p2, p2+5); + VERIFY_SCAN_IS (std::ctype_base::xdigit, p2, p2+5); + + VERIFY_SCAN_NOT (std::ctype_base::alnum, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::alpha, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::cntrl, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::digit, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::graph, p2, p2+5); + VERIFY_SCAN_NOT (std::ctype_base::lower, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::print, p2, p2+5); + VERIFY_SCAN_NOT (std::ctype_base::punct, p2, p2+5); + VERIFY_SCAN_NOT (std::ctype_base::space, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::upper, p2, p2); + VERIFY_SCAN_NOT (std::ctype_base::xdigit, p2, p2); +} +#endif + +int main() +{ +#ifdef _GLIBCPP_USE_WCHAR_T + test01(); +#endif + return 0; +} -- 2.47.2