From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/testsuite/g++.dg/dfp/44473-1.C | 122 +++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/dfp/44473-2.C | 25 +++++++ gcc/testsuite/g++.dg/dfp/base.C | 23 +++++++ gcc/testsuite/g++.dg/dfp/dfp.exp | 67 ++++++++++++++++++ gcc/testsuite/g++.dg/dfp/mangle-1.C | 40 +++++++++++ gcc/testsuite/g++.dg/dfp/mangle-2.C | 28 ++++++++ gcc/testsuite/g++.dg/dfp/mangle-3.C | 28 ++++++++ gcc/testsuite/g++.dg/dfp/mangle-4.C | 35 ++++++++++ gcc/testsuite/g++.dg/dfp/mangle-5.C | 29 ++++++++ gcc/testsuite/g++.dg/dfp/mangle-mode.C | 37 ++++++++++ gcc/testsuite/g++.dg/dfp/nofields.C | 19 +++++ gcc/testsuite/g++.dg/dfp/typeid1.C | 8 +++ 12 files changed, 461 insertions(+) create mode 100644 gcc/testsuite/g++.dg/dfp/44473-1.C create mode 100644 gcc/testsuite/g++.dg/dfp/44473-2.C create mode 100644 gcc/testsuite/g++.dg/dfp/base.C create mode 100644 gcc/testsuite/g++.dg/dfp/dfp.exp create mode 100644 gcc/testsuite/g++.dg/dfp/mangle-1.C create mode 100644 gcc/testsuite/g++.dg/dfp/mangle-2.C create mode 100644 gcc/testsuite/g++.dg/dfp/mangle-3.C create mode 100644 gcc/testsuite/g++.dg/dfp/mangle-4.C create mode 100644 gcc/testsuite/g++.dg/dfp/mangle-5.C create mode 100644 gcc/testsuite/g++.dg/dfp/mangle-mode.C create mode 100644 gcc/testsuite/g++.dg/dfp/nofields.C create mode 100644 gcc/testsuite/g++.dg/dfp/typeid1.C (limited to 'gcc/testsuite/g++.dg/dfp') diff --git a/gcc/testsuite/g++.dg/dfp/44473-1.C b/gcc/testsuite/g++.dg/dfp/44473-1.C new file mode 100644 index 000000000..38689fa16 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/44473-1.C @@ -0,0 +1,122 @@ +/* { dg-do assemble } */ + +/* Minimized from the testcase in PR c++/44473; mangling of decimal types + did not include CV qualifiers. */ + +namespace std +{ + namespace decimal + { + class decimal32 + { + public: + typedef float __decfloat32 __attribute__ ((mode (SD))); + explicit decimal32 (float __r):__val (__r) {} + private: + __decfloat32 __val; + }; + }; + + template + _BI2 copy_backward (_BI1 __first, _BI2 __result); +} + +namespace __gnu_cxx +{ + template + class __normal_iterator + { + public: + explicit __normal_iterator (const _Iterator & __i) {} + const _Iterator & base () const {} + }; + + template + bool operator== (const __normal_iterator <_IteratorL, _Container> &__lhs, + const __normal_iterator <_IteratorR, _Container> &__rhs) + { + return __lhs.base () == __rhs.base (); + } + + template + class new_allocator + { + public: + typedef _Tp *pointer; + typedef const _Tp *const_pointer; + template + struct rebind + { + typedef new_allocator <_Tp1> other; + }; + }; +} + +namespace std +{ + template + class allocator:public __gnu_cxx::new_allocator <_Tp> {}; + + template + struct _Vector_base + { + typedef typename _Alloc::template rebind <_Tp>::other _Tp_alloc_type; + struct _Vector_impl:public _Tp_alloc_type + { + typename _Tp_alloc_type::pointer _M_finish; + }; + public: _Vector_impl _M_impl; + }; + + template > + class vector:protected _Vector_base <_Tp, _Alloc> + { + typedef _Vector_base <_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public: + typedef _Tp value_type; + typedef typename _Tp_alloc_type::pointer pointer; + typedef typename _Tp_alloc_type::const_pointer const_pointer; + typedef __gnu_cxx::__normal_iterator iterator; + typedef __gnu_cxx::__normal_iterator + const_iterator; + const_iterator begin () const; + iterator end () + { + return iterator (this->_M_impl._M_finish); + } + const_iterator end () const + { + return const_iterator (this->_M_impl._M_finish); + } + bool empty () const + { + return begin () == end (); + } + void push_back (const value_type & __x) + { + _M_insert_aux (end ()); + } + void _M_insert_aux (iterator __position); + }; + + template + void vector <_Tp, _Alloc>::_M_insert_aux (iterator __position) + { + std::copy_backward (__position.base (), this->_M_impl._M_finish - 1); + } +} + +std::vector vec; + +int +foo () +{ + return (vec.empty ()) ? 1 : 0; +} + +bool +bar () +{ + vec.push_back (std::decimal::decimal32 (0)); +} diff --git a/gcc/testsuite/g++.dg/dfp/44473-2.C b/gcc/testsuite/g++.dg/dfp/44473-2.C new file mode 100644 index 000000000..311f62299 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/44473-2.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +int bar (const std::decimal::decimal64 & x) { } + +int foo () +{ + std::decimal::decimal64 x(0); + bar (x); +} + +// { dg-final { scan-assembler "_Z3barRKDd:" } } diff --git a/gcc/testsuite/g++.dg/dfp/base.C b/gcc/testsuite/g++.dg/dfp/base.C new file mode 100644 index 000000000..3e5dc50ba --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/base.C @@ -0,0 +1,23 @@ +// PR c++/50207 +// { dg-do compile } + +namespace std +{ + namespace decimal + { + template struct _FmtTraits; + class decimal32; + template <> struct _FmtTraits + { + static const long _NumBytes = 4UL; + }; + template class _DecBase + { + unsigned char _Bytes[_Tr::_NumBytes]; + }; + class decimal32 : public _DecBase <_FmtTraits > // { dg-error "has base" } + { + decimal32 () { } + }; + } +} diff --git a/gcc/testsuite/g++.dg/dfp/dfp.exp b/gcc/testsuite/g++.dg/dfp/dfp.exp new file mode 100644 index 000000000..4b15ca529 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/dfp.exp @@ -0,0 +1,67 @@ +# Copyright (C) 2005, 2006, 2007, 2009 Free Software Foundation, Inc. + +# This program 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 3 of the License, or +# (at your option) any later version. +# +# This program 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 GCC; see the file COPYING3. If not see +# . + +# GCC testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# Skip these tests for targets that don't support this extension. +if { ![check_effective_target_dfp] } { + return; +} + +# If the decimal float is supported in the compiler but not yet in the +# runtime, treat all tests as compile-only. +global dg-do-what-default +set save-dg-do-what-default ${dg-do-what-default} +if { ![check_effective_target_dfprt] } { + verbose "dfp.exp: runtime support for decimal float does not exist" 2 + set dg-do-what-default compile +} else { + verbose "dfp.exp: runtime support for decimal float exists, use it" 2 + set dg-do-what-default run +} +verbose "dfp.exp: dg-do-what-default is ${dg-do-what-default}" 2 + +global DEFAULT_CXXFLAGS +if [info exists DEFAULT_CXXFLAGS] then { + set save_default_cxxflags $DEFAULT_CXXFLAGS +} + +# If a testcase doesn't have special options, use these. +set DEFAULT_CXXFLAGS "" + +# Initialize `dg'. +dg-init + +# Main loop. Run the tests that are specific to C++. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[C]] \ + "" $DEFAULT_CXXFLAGS +# Run tests that are shared with C testing. +dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/dfp/*.c]] \ + "" $DEFAULT_CXXFLAGS + +# All done. +dg-finish + +set dg-do-what-default ${save-dg-do-what-default} +verbose "dfp.exp: dg-do-what-default is ${dg-do-what-default}" 2 +if [info exists save_default_cxxflags] { + set DEFAULT_CXXFLAGS $save_default_cxxflags +} else { + unset DEFAULT_CXXFLAGS +} diff --git a/gcc/testsuite/g++.dg/dfp/mangle-1.C b/gcc/testsuite/g++.dg/dfp/mangle-1.C new file mode 100644 index 000000000..455d3e4c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-1.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle13.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (float __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A { + template std::decimal::decimal64 f (); + std::decimal::decimal64 operator+(); + operator std::decimal::decimal64 (); + template + std::decimal::decimal64 operator-(); +}; + +typedef std::decimal::decimal64 (A::*P)(); + +template

struct S {}; + +template void g (S<&T::template f >) {} +template void g (S<&T::operator+ >) {} +template void g (S<&T::operator std::decimal::decimal64>) {} +template void g (S<&T::template operator- >) {} + +template void g (S<&A::f >); +template void g (S<&A::operator+>); +template void g (S<&A::operator std::decimal::decimal64>); + +// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_1fIDdEEE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_plEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-2.C b/gcc/testsuite/g++.dg/dfp/mangle-2.C new file mode 100644 index 000000000..1af9aa1a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-2.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle15.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (float __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A { + template std::decimal::decimal64 f (); +}; + +typedef std::decimal::decimal64 (A::*P)(); + +template

struct S {}; + +void g (S<&A::f >) {} + +// { dg-final { scan-assembler "\n?_Z1g1SIXadL_ZN1A1fIDdEEDdvEEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-3.C b/gcc/testsuite/g++.dg/dfp/mangle-3.C new file mode 100644 index 000000000..c716ed0e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-3.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle20-1.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +template void f(std::decimal::decimal64 (*)[2]) {} +template void g(std::decimal::decimal64 (*)[I+2]) {} + +static const std::decimal::decimal64 I(1); +static const std::decimal::decimal64 J(2); + +template void f<1>(std::decimal::decimal64 (*)[2]); +template void g<1>(std::decimal::decimal64 (*)[3]); + +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPA2_Dd\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_Dd\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-4.C b/gcc/testsuite/g++.dg/dfp/mangle-4.C new file mode 100644 index 000000000..899d5661c --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-4.C @@ -0,0 +1,35 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle30.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A +{ + template + struct B + { + typedef T myT; + }; +}; + +template +void f (T t, typename T::template B::myT u, typename T::template B::myT v); + +void foo () +{ + f (A(), std::decimal::decimal64(0), 1); +} + +// { dg-final { scan-assembler "_Z1fI1AEvT_NS1_1BIDdE3myTENS2_IiE3myTE" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-5.C b/gcc/testsuite/g++.dg/dfp/mangle-5.C new file mode 100644 index 000000000..794577f86 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-5.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle35.C. + +namespace std { + namespace decimal { + class decimal128 { + public: + typedef float __decfloat128 __attribute__ ((mode (TD))); + explicit decimal128 (int __r):__val (__r) {} + private: + __decfloat128 __val; + }; + } +} + +template struct A {}; + +template void foo(); + +template A > bar(); + +void baz() +{ + bar(); +} + +// { dg-final { scan-assembler "_Z3barIDeE1AIX3fooIT_EEEv" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-mode.C b/gcc/testsuite/g++.dg/dfp/mangle-mode.C new file mode 100644 index 000000000..ac30cb323 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-mode.C @@ -0,0 +1,37 @@ +// { dg-do compile } + +// Check that the compiler mangles types defined with decimal float +// modes according to the vendor-neutral C++ ABI. + +typedef float _Decimal32 __attribute__((mode(SD))); +typedef float _Decimal64 __attribute__((mode(DD))); +typedef float _Decimal128 __attribute__((mode(TD))); + +extern void foo32 (_Decimal32 a, _Decimal32 &b, _Decimal32 *c); +extern void foo64 (_Decimal64 *a, _Decimal64 b, _Decimal64 &c); +extern void foo128 (_Decimal128 &a, _Decimal128 *b, _Decimal128 c); + +void +bar32 (void) +{ + _Decimal32 x, y, z; + foo32 (x, y, &z); +} + +void +bar64 (void) +{ + _Decimal64 x, y, z; + foo64 (&x, y, z); +} + +void +bar128 (void) +{ + _Decimal128 x, y, z; + foo128 (x, &y, z); +} + +// { dg-final { scan-assembler "Z5foo32DfRDfPDf" } } +// { dg-final { scan-assembler "Z5foo64PDdDdRDd" } } +// { dg-final { scan-assembler "Z6foo128RDePDeDe" } } diff --git a/gcc/testsuite/g++.dg/dfp/nofields.C b/gcc/testsuite/g++.dg/dfp/nofields.C new file mode 100644 index 000000000..7234672d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/nofields.C @@ -0,0 +1,19 @@ +// PR c++/46862 +// { dg-do compile } + +namespace std +{ + namespace decimal + { + class decimal32 { }; // { dg-error "does not have any fields" } + class decimal64 { }; // { dg-error "does not have any fields" } + class decimal128 { }; // { dg-error "does not have any fields" } + } +} + +void +foo (std::decimal::decimal32 x, + std::decimal::decimal64 y, + std::decimal::decimal128 z) +{ +} diff --git a/gcc/testsuite/g++.dg/dfp/typeid1.C b/gcc/testsuite/g++.dg/dfp/typeid1.C new file mode 100644 index 000000000..cdc33a774 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/typeid1.C @@ -0,0 +1,8 @@ +// PR c++/39131 +// { dg-do link } + +#include + +const std::type_info &r = typeid(0.dd); + +int main() { } -- cgit v1.2.3