summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/torture/pr44972.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/torture/pr44972.C')
-rw-r--r--gcc/testsuite/g++.dg/torture/pr44972.C142
1 files changed, 142 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/torture/pr44972.C b/gcc/testsuite/g++.dg/torture/pr44972.C
new file mode 100644
index 000000000..e409148da
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr44972.C
@@ -0,0 +1,142 @@
+/* { dg-do compile } */
+
+#include<cassert>
+#include<new>
+#include<utility>
+
+namespace boost {
+
+template<class T>
+class optional;
+
+class aligned_storage
+{
+ char data[ 1000 ];
+ public:
+ void const* address() const { return &data[0]; }
+ void * address() { return &data[0]; }
+} ;
+
+
+template<class T>
+class optional_base
+{
+ protected :
+ optional_base(){}
+ optional_base ( T const& val )
+ {
+ construct(val);
+ }
+
+ template<class U>
+ void assign ( optional<U> const& rhs )
+ {
+ if (!is_initialized())
+ if ( rhs.is_initialized() )
+ construct(T());
+ }
+
+ public :
+
+ bool is_initialized() const { return m_initialized ; }
+
+ protected :
+
+ void construct ( T const& val )
+ {
+ new (m_storage.address()) T(val) ;
+ }
+
+ T const* get_ptr_impl() const
+ { return static_cast<T const*>(m_storage.address()); }
+
+ private :
+
+ bool m_initialized ;
+ aligned_storage m_storage ;
+} ;
+
+
+template<class T>
+class optional : public optional_base<T>
+{
+ typedef optional_base<T> base ;
+
+ public :
+
+ optional() : base() {}
+ optional ( T const& val ) : base(val) {}
+ optional& operator= ( optional const& rhs )
+ {
+ this->assign( rhs ) ;
+ return *this ;
+ }
+
+ T const& get() const ;
+
+ T const* operator->() const { assert(this->is_initialized()) ; return this->get_ptr_impl() ; }
+
+} ;
+
+
+} // namespace boost
+
+
+namespace std
+{
+
+ template<typename _Tp, std::size_t _Nm>
+ struct array
+ {
+ typedef _Tp value_type;
+ typedef const value_type* const_iterator;
+
+ value_type _M_instance[_Nm];
+
+ };
+}
+
+
+class NT
+{
+ double _inf, _sup;
+};
+
+
+template < typename T > inline
+std::array<T, 1>
+make_array(const T& b1)
+{
+ std::array<T, 1> a = { { b1 } };
+ return a;
+}
+
+class V
+{
+ typedef std::array<NT, 1> Base;
+ Base base;
+
+public:
+ V() {}
+ V(const NT &x)
+ : base(make_array(x)) {}
+
+};
+
+using boost::optional ;
+
+optional< std::pair< NT, NT > >
+ linsolve_pointC2() ;
+
+optional< V > construct_normal_offset_lines_isecC2 ( )
+{
+ optional< std::pair<NT,NT> > ip;
+
+ ip = linsolve_pointC2();
+
+ V a(ip->first) ;
+ return a;
+}
+
+
+