X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Ftestsuite%2Fext%2Fext_pointer%2F1_neg.cc;fp=libstdc%2B%2B-v3%2Ftestsuite%2Fext%2Fext_pointer%2F1_neg.cc;h=e39c32129a484a56bea209651f491a4f4577fb00;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=0000000000000000000000000000000000000000;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc b/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc new file mode 100644 index 00000000..e39c3212 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/ext_pointer/1_neg.cc @@ -0,0 +1,103 @@ +// Bob Walters 10-2008 + +// Test for Container using non-standard pointer types. + +// Copyright (C) 2008, 2009 +// 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 3, 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 COPYING3. If not see +// . + + +// { dg-do compile } + +#include +#include +#include + +using __gnu_cxx::_Pointer_adapter; +using __gnu_cxx::_Relative_pointer_impl; +using __gnu_cxx::__static_pointer_cast; +using __gnu_cxx::__const_pointer_cast; + + +struct A { + int i; +}; +struct B : public A{ + int j; +}; +typedef _Pointer_adapter<_Relative_pointer_impl > B_pointer; +typedef _Pointer_adapter<_Relative_pointer_impl > const_B_pointer; +typedef _Pointer_adapter<_Relative_pointer_impl > A_pointer; +typedef _Pointer_adapter<_Relative_pointer_impl > const_A_pointer; + + +void test01(void) { + bool test __attribute__((unused)) = true; + + A a; + B b; + + A_pointer aptr( &a ); + + // Can't implicitly cast from A* to B* + B_pointer bptr1(aptr); // { dg-error "instantiated from here" 31 } + B_pointer bptr2(&a); // { dg-error "instantiated from here" 32 } + + // but explicit cast/conversion is OK. + B_pointer bptr3(__static_pointer_cast(aptr)); // ok + B_pointer bptr4(__static_pointer_cast(&a)); // ok + + // Can't implicitly cast from A* to B* + bptr1 = aptr; // { dg-error "instantiated from here" 39 } + bptr1 = &a; // { dg-error "instantiated from here" 40 } + + // but explicit cast/conversion is OK. + bptr1 = __static_pointer_cast(aptr); // ok + bptr1 = __static_pointer_cast(&a); // ok + + // Similarly, can't shed constness via implicit cast + const_A_pointer captr(&a); + A_pointer aptr2(captr); // { dg-error "instantiated from here" 48 } + + // but explicit cast/conversion is OK. + A_pointer aptr3(__const_pointer_cast(captr)); // ok + + // Similarly, can't shed constness via implicit cast + aptr2 = captr; // { dg-error "instantiated from here" 54 } + + // but explicit cast/conversion is OK. + aptr3 = __const_pointer_cast(captr); // ok + + // Combine explicit const cast with implicit downcast. + const_B_pointer cbptr(&b); + A_pointer aptr4(cbptr); // { dg-error "instantiated from here" 61 } + aptr4 = cbptr; // { dg-error "instantiated from here" 62 } + + A_pointer aptr5(__const_pointer_cast(cbptr)); // ok + aptr5 = __const_pointer_cast(cbptr); // ok +} + +// { dg-error "invalid conversion " "" { target *-*-* } 294 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 294 } +// { dg-error "invalid conversion " "" { target *-*-* } 300 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 300 } +// { dg-error "invalid conversion " "" { target *-*-* } 317 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 317 } +// { dg-error "invalid conversion " "" { target *-*-* } 325 } +// { dg-error "initializing argument 1 of" "" { target *-*-* } 325 } +// { dg-excess-errors "In constructor" } +