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/conversion/access1.C | 25 +++++++++++++ gcc/testsuite/g++.dg/conversion/ambig1.C | 9 +++++ gcc/testsuite/g++.dg/conversion/base1.C | 20 ++++++++++ gcc/testsuite/g++.dg/conversion/bitfield1.C | 17 +++++++++ gcc/testsuite/g++.dg/conversion/bitfield10.C | 24 ++++++++++++ gcc/testsuite/g++.dg/conversion/bitfield11.C | 8 ++++ gcc/testsuite/g++.dg/conversion/bitfield2.C | 11 ++++++ gcc/testsuite/g++.dg/conversion/bitfield3.C | 14 +++++++ gcc/testsuite/g++.dg/conversion/bitfield4.C | 20 ++++++++++ gcc/testsuite/g++.dg/conversion/bitfield5.C | 14 +++++++ gcc/testsuite/g++.dg/conversion/bitfield6.C | 10 +++++ gcc/testsuite/g++.dg/conversion/bitfield7.C | 16 ++++++++ gcc/testsuite/g++.dg/conversion/bitfield8.C | 16 ++++++++ gcc/testsuite/g++.dg/conversion/bitfield9.C | 17 +++++++++ gcc/testsuite/g++.dg/conversion/cast1.C | 22 +++++++++++ gcc/testsuite/g++.dg/conversion/cast2.C | 9 +++++ gcc/testsuite/g++.dg/conversion/cast3.C | 14 +++++++ gcc/testsuite/g++.dg/conversion/cond1.C | 12 ++++++ gcc/testsuite/g++.dg/conversion/cond2.C | 15 ++++++++ gcc/testsuite/g++.dg/conversion/cond3.C | 20 ++++++++++ gcc/testsuite/g++.dg/conversion/cond4.C | 31 ++++++++++++++++ gcc/testsuite/g++.dg/conversion/cond6.C | 18 +++++++++ gcc/testsuite/g++.dg/conversion/const1.C | 5 +++ gcc/testsuite/g++.dg/conversion/const2.C | 11 ++++++ gcc/testsuite/g++.dg/conversion/const3.C | 7 ++++ gcc/testsuite/g++.dg/conversion/dr195-1.C | 34 +++++++++++++++++ gcc/testsuite/g++.dg/conversion/dr195.C | 31 ++++++++++++++++ gcc/testsuite/g++.dg/conversion/dynamic1.C | 15 ++++++++ gcc/testsuite/g++.dg/conversion/enum1.C | 10 +++++ gcc/testsuite/g++.dg/conversion/err-recover1.C | 8 ++++ gcc/testsuite/g++.dg/conversion/memfn1.C | 26 +++++++++++++ gcc/testsuite/g++.dg/conversion/memfn2.C | 11 ++++++ gcc/testsuite/g++.dg/conversion/nullptr1.C | 10 +++++ gcc/testsuite/g++.dg/conversion/nullptr2.C | 10 +++++ gcc/testsuite/g++.dg/conversion/op1.C | 11 ++++++ gcc/testsuite/g++.dg/conversion/op2.C | 16 ++++++++ gcc/testsuite/g++.dg/conversion/op3.C | 3 ++ gcc/testsuite/g++.dg/conversion/op4.C | 19 ++++++++++ gcc/testsuite/g++.dg/conversion/op5.C | 20 ++++++++++ gcc/testsuite/g++.dg/conversion/op6.C | 18 +++++++++ gcc/testsuite/g++.dg/conversion/ptrmem1.C | 13 +++++++ gcc/testsuite/g++.dg/conversion/ptrmem2.C | 39 ++++++++++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem3.C | 31 ++++++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem4.C | 43 ++++++++++++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem5.C | 35 ++++++++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem6.C | 35 ++++++++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem7.C | 29 +++++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem8.C | 25 +++++++++++++ gcc/testsuite/g++.dg/conversion/ptrmem9.C | 26 +++++++++++++ gcc/testsuite/g++.dg/conversion/reinterpret1.C | 6 +++ gcc/testsuite/g++.dg/conversion/reinterpret2.C | 5 +++ gcc/testsuite/g++.dg/conversion/reinterpret3.C | 7 ++++ gcc/testsuite/g++.dg/conversion/self1.C | 15 ++++++++ gcc/testsuite/g++.dg/conversion/simd1.C | 26 +++++++++++++ gcc/testsuite/g++.dg/conversion/simd2.C | 16 ++++++++ gcc/testsuite/g++.dg/conversion/simd3.C | 15 ++++++++ gcc/testsuite/g++.dg/conversion/simd4.C | 34 +++++++++++++++++ .../g++.dg/conversion/to-virtual-base-1.C | 15 ++++++++ gcc/testsuite/g++.dg/conversion/void1.C | 5 +++ 59 files changed, 1047 insertions(+) create mode 100644 gcc/testsuite/g++.dg/conversion/access1.C create mode 100644 gcc/testsuite/g++.dg/conversion/ambig1.C create mode 100644 gcc/testsuite/g++.dg/conversion/base1.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield1.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield10.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield11.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield2.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield3.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield4.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield5.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield6.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield7.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield8.C create mode 100644 gcc/testsuite/g++.dg/conversion/bitfield9.C create mode 100644 gcc/testsuite/g++.dg/conversion/cast1.C create mode 100644 gcc/testsuite/g++.dg/conversion/cast2.C create mode 100644 gcc/testsuite/g++.dg/conversion/cast3.C create mode 100644 gcc/testsuite/g++.dg/conversion/cond1.C create mode 100644 gcc/testsuite/g++.dg/conversion/cond2.C create mode 100644 gcc/testsuite/g++.dg/conversion/cond3.C create mode 100644 gcc/testsuite/g++.dg/conversion/cond4.C create mode 100644 gcc/testsuite/g++.dg/conversion/cond6.C create mode 100644 gcc/testsuite/g++.dg/conversion/const1.C create mode 100644 gcc/testsuite/g++.dg/conversion/const2.C create mode 100644 gcc/testsuite/g++.dg/conversion/const3.C create mode 100644 gcc/testsuite/g++.dg/conversion/dr195-1.C create mode 100644 gcc/testsuite/g++.dg/conversion/dr195.C create mode 100644 gcc/testsuite/g++.dg/conversion/dynamic1.C create mode 100644 gcc/testsuite/g++.dg/conversion/enum1.C create mode 100644 gcc/testsuite/g++.dg/conversion/err-recover1.C create mode 100644 gcc/testsuite/g++.dg/conversion/memfn1.C create mode 100644 gcc/testsuite/g++.dg/conversion/memfn2.C create mode 100644 gcc/testsuite/g++.dg/conversion/nullptr1.C create mode 100644 gcc/testsuite/g++.dg/conversion/nullptr2.C create mode 100644 gcc/testsuite/g++.dg/conversion/op1.C create mode 100644 gcc/testsuite/g++.dg/conversion/op2.C create mode 100644 gcc/testsuite/g++.dg/conversion/op3.C create mode 100644 gcc/testsuite/g++.dg/conversion/op4.C create mode 100644 gcc/testsuite/g++.dg/conversion/op5.C create mode 100644 gcc/testsuite/g++.dg/conversion/op6.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem1.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem2.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem3.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem4.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem5.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem6.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem7.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem8.C create mode 100644 gcc/testsuite/g++.dg/conversion/ptrmem9.C create mode 100644 gcc/testsuite/g++.dg/conversion/reinterpret1.C create mode 100644 gcc/testsuite/g++.dg/conversion/reinterpret2.C create mode 100644 gcc/testsuite/g++.dg/conversion/reinterpret3.C create mode 100644 gcc/testsuite/g++.dg/conversion/self1.C create mode 100644 gcc/testsuite/g++.dg/conversion/simd1.C create mode 100644 gcc/testsuite/g++.dg/conversion/simd2.C create mode 100644 gcc/testsuite/g++.dg/conversion/simd3.C create mode 100644 gcc/testsuite/g++.dg/conversion/simd4.C create mode 100644 gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C create mode 100644 gcc/testsuite/g++.dg/conversion/void1.C (limited to 'gcc/testsuite/g++.dg/conversion') diff --git a/gcc/testsuite/g++.dg/conversion/access1.C b/gcc/testsuite/g++.dg/conversion/access1.C new file mode 100644 index 000000000..f187e63a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/access1.C @@ -0,0 +1,25 @@ +// PR c++/38579 + +struct P +{ +protected: + P() {} + P(const P&) {} +}; + +struct B : protected P +{ + B() {} +}; + +struct C : public P +{ + // C can access P's copy ctor, but can't convert b to const P&. + C(const B& b) : P(b) {} // { dg-error "inaccessible base" } +}; + +void foo() +{ + B b; + C c(b); +} diff --git a/gcc/testsuite/g++.dg/conversion/ambig1.C b/gcc/testsuite/g++.dg/conversion/ambig1.C new file mode 100644 index 000000000..85ea1d25f --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ambig1.C @@ -0,0 +1,9 @@ +// PR c++/19787 + +struct H { + operator char(); // { dg-message "note" } + operator short(); // { dg-message "note" } +}; + +int const& ref = H(); // { dg-error "ambiguous" } +// { dg-message "candidate" "candidate note" { target *-*-* } 8 } diff --git a/gcc/testsuite/g++.dg/conversion/base1.C b/gcc/testsuite/g++.dg/conversion/base1.C new file mode 100644 index 000000000..e236504ae --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/base1.C @@ -0,0 +1,20 @@ +// PR c++/48749 + +struct Tuple3 +{ + float x; +}; + +struct Pos: virtual Tuple3 { }; + +struct TexCoords +{ + Pos pos; +}; + +template +void eval (const TexCoords &coords) +{ + const Pos &pos = coords.pos; + pos.x; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield1.C b/gcc/testsuite/g++.dg/conversion/bitfield1.C new file mode 100644 index 000000000..a660e7950 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield1.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-options "-w" } + +enum E { a, b = 1LL << 48 }; + +struct S { + E e : 3; +}; + +S s; + +int main () { + if (sizeof (E) != sizeof (long long)) + return 1; + if (sizeof (s.e + 3) != sizeof (long long)) + return 2; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield10.C b/gcc/testsuite/g++.dg/conversion/bitfield10.C new file mode 100644 index 000000000..f75504e0d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield10.C @@ -0,0 +1,24 @@ +// PR c++/38007 +// We need to use the conversion function to the declared type of a bitfield, +// not the lowered bitfield type. +// { dg-do link } + +struct A +{ + operator unsigned int() { return 42; } + operator unsigned char(); +}; + +struct B +{ + unsigned int b : 8; +}; + +int +main () +{ + A u; + unsigned int v = u; + B w; + w.b = u; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield11.C b/gcc/testsuite/g++.dg/conversion/bitfield11.C new file mode 100644 index 000000000..e36539c64 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield11.C @@ -0,0 +1,8 @@ +// Make sure that digest_init converts to the declared type of the +// bitfield, not just the lowered type. + +enum E { EA, EB }; + +struct A { E e: 8; }; + +A a = { 0 }; // { dg-error "invalid conversion" } diff --git a/gcc/testsuite/g++.dg/conversion/bitfield2.C b/gcc/testsuite/g++.dg/conversion/bitfield2.C new file mode 100644 index 000000000..aa60d3505 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield2.C @@ -0,0 +1,11 @@ +// PR c++/27292 + +struct A +{ + int i : 8; +}; + +bool foo(A a) +{ + return int(a.i); +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield3.C b/gcc/testsuite/g++.dg/conversion/bitfield3.C new file mode 100644 index 000000000..a897bf59e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield3.C @@ -0,0 +1,14 @@ +// PR c++/16376 +// { dg-do run } + +int main(void){ + struct bits { + unsigned int ui3 : 3; + } bits; + int i = -1; /* is a very large positive number as unsigned */ + + bits.ui3 = 1u; + if( bits.ui3 < i ) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield4.C b/gcc/testsuite/g++.dg/conversion/bitfield4.C new file mode 100644 index 000000000..75fe3016e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield4.C @@ -0,0 +1,20 @@ +// PR c++/27292 + +enum ColorRole +{ + WindowText, Button +}; + +struct QPalette { + +ColorRole bg_role:8; + + bool hasBackground(); +}; + + +bool +QPalette::hasBackground () +{ + return (ColorRole (bg_role) != WindowText); +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield5.C b/gcc/testsuite/g++.dg/conversion/bitfield5.C new file mode 100644 index 000000000..b931ec97c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield5.C @@ -0,0 +1,14 @@ +// PR c++/27506 + +enum EBorderStyle + { + BNATIVE, BHIDDEN + }; +struct BorderValue +{ + enum EBorderStyle style:8; +}; +enum EBorderStyle f(const struct BorderValue *border) +{ + return border ? border->style : BNATIVE; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield6.C b/gcc/testsuite/g++.dg/conversion/bitfield6.C new file mode 100644 index 000000000..79664ab7d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield6.C @@ -0,0 +1,10 @@ +// PR c++/27471 + +struct A { unsigned a:8; }; + +extern void b(unsigned char); + +void breakme (A f) +{ + b((unsigned char) f.a); +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield7.C b/gcc/testsuite/g++.dg/conversion/bitfield7.C new file mode 100644 index 000000000..1080168dc --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield7.C @@ -0,0 +1,16 @@ +// PR c++/33984 +// { dg-do compile } + +struct S +{ + unsigned int bar : 3; +} s; + +int foo (unsigned int &); +int foo (double); + +int +main () +{ + return foo (s.bar); // { dg-error "cannot bind bitfield" } +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield8.C b/gcc/testsuite/g++.dg/conversion/bitfield8.C new file mode 100644 index 000000000..dbc62fade --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield8.C @@ -0,0 +1,16 @@ +// PR c++/35056 +// { dg-do compile } +// { dg-options "-O2" } + +enum EBorderStyle { bla = 1 }; +inline bool compare_ref(const unsigned int &t, const EBorderStyle &u) +{ return t == u; } +inline bool compare_val(const unsigned int t, const EBorderStyle u) +{ return t == u; } +struct S { + unsigned m_style : 4; +}; +void call_ref (S *s, EBorderStyle v) +{ if (!compare_ref(s->m_style, v)) s->m_style = v; } +void call_val (S *s, EBorderStyle v) +{ if (!compare_val(s->m_style, v)) s->m_style = v; } diff --git a/gcc/testsuite/g++.dg/conversion/bitfield9.C b/gcc/testsuite/g++.dg/conversion/bitfield9.C new file mode 100644 index 000000000..998dd4873 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield9.C @@ -0,0 +1,17 @@ +// PR c++/35909 +// { dg-do compile } + +struct MidiCommand +{ + unsigned data1 : 8; +}; + +void g(const unsigned char &); +void h(const unsigned int &); + +void f(MidiCommand mc) +{ + g(mc.data1); + h(mc.data1); +} + diff --git a/gcc/testsuite/g++.dg/conversion/cast1.C b/gcc/testsuite/g++.dg/conversion/cast1.C new file mode 100644 index 000000000..f90b42165 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast1.C @@ -0,0 +1,22 @@ +// PR c++/10841 + +int main() { + class Base { + public: + int i, j, k; + void f(); }; + + class Derived : private Base { + public: + int m, n, p; + void g(); + }; + + Derived derived; + Base &base = (Base &)derived; + (int Base::*)&Derived::n; + (int Derived::*)&Base::j; + (void (Base::*)(void))&Derived::g; + (void (Derived::*)(void))&Base::f; +} + diff --git a/gcc/testsuite/g++.dg/conversion/cast2.C b/gcc/testsuite/g++.dg/conversion/cast2.C new file mode 100644 index 000000000..ac8329730 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast2.C @@ -0,0 +1,9 @@ +// Origin: PR c++/42260 +// { dg-do compile } + +struct A +{ + template operator T*(); +}; + +int i = *A();// { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/conversion/cast3.C b/gcc/testsuite/g++.dg/conversion/cast3.C new file mode 100644 index 000000000..43287a1eb --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast3.C @@ -0,0 +1,14 @@ +// Origin: PR c++/46824 + +class Incomplete; +struct Ptr +{ + operator Incomplete*(); +}; + +int +main() +{ + Ptr p; + *p; +} diff --git a/gcc/testsuite/g++.dg/conversion/cond1.C b/gcc/testsuite/g++.dg/conversion/cond1.C new file mode 100644 index 000000000..16184ccb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond1.C @@ -0,0 +1,12 @@ +// PR c++/9440 + struct A { + explicit A(int = 0); + A(const A&); + operator int() const; + }; + + A + bar(bool b, const A& a) + { + return (b ? A() : a); + } diff --git a/gcc/testsuite/g++.dg/conversion/cond2.C b/gcc/testsuite/g++.dg/conversion/cond2.C new file mode 100644 index 000000000..d31de33e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond2.C @@ -0,0 +1,15 @@ +// PR c++/10245 + +struct X {}; + +struct Y { + Y (); + operator X () const; +private: + Y (const Y &); +}; + +Y y; +void foo() { + X x = (1 ? Y() : Y()); +} diff --git a/gcc/testsuite/g++.dg/conversion/cond3.C b/gcc/testsuite/g++.dg/conversion/cond3.C new file mode 100644 index 000000000..da052d453 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond3.C @@ -0,0 +1,20 @@ +// PR c++/9537 + +class String +{ +public: + String(); + String( char *str ); + operator char *(); +}; + +const String operator+( String s1, String ) +{ + return s1; +} + +String valGlue(const String before) +{ + String ret; + return false ? ret : before + before; +} diff --git a/gcc/testsuite/g++.dg/conversion/cond4.C b/gcc/testsuite/g++.dg/conversion/cond4.C new file mode 100644 index 000000000..3bd64763a --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond4.C @@ -0,0 +1,31 @@ +// Origin: PR c++/45383 +// { dg-do run } + +struct null { + null() {} + template + operator T*() const { + return 0; + } + + template + operator T C::*() const { + return 0; + } +private: + null(const null&); + null& operator=(const null&); + void operator&() const; +}; + +static struct null null; + +int +main() +{ + int* ptr = null; + if (ptr == null) + return 0; + if (ptr != null) + return 1; +} diff --git a/gcc/testsuite/g++.dg/conversion/cond6.C b/gcc/testsuite/g++.dg/conversion/cond6.C new file mode 100644 index 000000000..8c05e1b14 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond6.C @@ -0,0 +1,18 @@ +// PR c++/11283 +// Converting "a" to the type of "i" produces "int" rather than "const +// int", which was causing build_conditional_expr to abort. But we don't +// care about cv-quals on non-class rvalues. + +struct A +{ + operator int (); +}; + +extern A a; +extern const int i; +extern bool b; + +int f () +{ + return b ? a : i; +} diff --git a/gcc/testsuite/g++.dg/conversion/const1.C b/gcc/testsuite/g++.dg/conversion/const1.C new file mode 100644 index 000000000..5e43bc063 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/const1.C @@ -0,0 +1,5 @@ +// PR c++/14211 + +void f(char *str) { + char *& m = const_cast(str); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/const2.C b/gcc/testsuite/g++.dg/conversion/const2.C new file mode 100644 index 000000000..fd2be1f44 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/const2.C @@ -0,0 +1,11 @@ +struct B {}; +struct D : public B {}; + +typedef int B::*bm; +typedef int D::*dm; + +bm bp; + +void f() { + const_cast(bp); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/const3.C b/gcc/testsuite/g++.dg/conversion/const3.C new file mode 100644 index 000000000..faa9f810c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/const3.C @@ -0,0 +1,7 @@ +// PR c++/18177 + +void foo() +{ + X; // { dg-error "" } + const_cast(X); +} diff --git a/gcc/testsuite/g++.dg/conversion/dr195-1.C b/gcc/testsuite/g++.dg/conversion/dr195-1.C new file mode 100644 index 000000000..ca38580e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dr195-1.C @@ -0,0 +1,34 @@ +// { dg-options "" } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 + +// DR 195 will allow conversions between function and object pointers +// under some circumstances. It is in drafting, so we don't implement +// it (yet). + +// this checks we are silent when not being pedantic. + +typedef void (*PF)(void); +typedef void *PV; +typedef int *PO; + + +void foo () +{ + PF pf; + PV pv; + PO po; + + /* the following two will almost definitly be ok with 195. */ + pf = reinterpret_cast (pv); + pv = reinterpret_cast (pf); + + /* the following two might or might not be ok with 195. */ + pf = reinterpret_cast (po); + po = reinterpret_cast (pf); + + /* These will never be ok, as they are implicit. */ + pv = pf; // { dg-error "invalid conversion" "" } + pf = pv; // { dg-error "invalid conversion" "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/dr195.C b/gcc/testsuite/g++.dg/conversion/dr195.C new file mode 100644 index 000000000..8502c1578 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dr195.C @@ -0,0 +1,31 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 + +// DR 195 will allow conversions between function and object pointers +// under some circumstances. It is in drafting, so we don't implement +// it (yet). + +// This checks we warn when being pedantic. + +typedef void (*PF)(void); +typedef void *PV; +typedef int *PO; + +void foo () +{ + PF pf; + PV pv; + PO po; + + /* the following two will almost definitly be ok with 195. */ + pf = reinterpret_cast (pv); // { dg-warning "casting between" "" } + pv = reinterpret_cast (pf); // { dg-warning "casting between" "" } + + /* the following two might or might not be ok with 195. */ + pf = reinterpret_cast (po); // { dg-warning "casting between" "" } + po = reinterpret_cast (pf); // { dg-warning "casting between" "" } + + /* These will never be ok, as they are implicit. */ + pv = pf; // { dg-error "invalid conversion" "" } + pf = pv; // { dg-error "invalid conversion" "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/dynamic1.C b/gcc/testsuite/g++.dg/conversion/dynamic1.C new file mode 100644 index 000000000..a781cbaa3 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dynamic1.C @@ -0,0 +1,15 @@ +// PR c++/10385 +// Origin: +// { dg-do compile } + +struct A +{ + void foo(); +}; + +A& bar(); + +void baz() +{ + dynamic_cast( bar().foo ); // { dg-error "cannot dynamic_cast" } +} diff --git a/gcc/testsuite/g++.dg/conversion/enum1.C b/gcc/testsuite/g++.dg/conversion/enum1.C new file mode 100644 index 000000000..6ea8cadb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/enum1.C @@ -0,0 +1,10 @@ +// { dg-do run } +// { dg-options "-O2 -finline-functions" } + +enum E { V = 1 }; +static const E E_MIN = V; +static const E E_MAX = V; + +bool valid(E v) { return v >= E_MIN && v <= E_MAX; } + +int main() { return valid(E(2)); } diff --git a/gcc/testsuite/g++.dg/conversion/err-recover1.C b/gcc/testsuite/g++.dg/conversion/err-recover1.C new file mode 100644 index 000000000..97237893d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/err-recover1.C @@ -0,0 +1,8 @@ +// PR c++/42219 + +void foo(const void); // { dg-error "incomplete|const" } + +void bar() +{ + void (*pf)() = foo; // { dg-error "cannot convert" } +} diff --git a/gcc/testsuite/g++.dg/conversion/memfn1.C b/gcc/testsuite/g++.dg/conversion/memfn1.C new file mode 100644 index 000000000..da2fb0fad --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/memfn1.C @@ -0,0 +1,26 @@ +// PR c++/36334 + +struct X +{ + typedef int* foobar(); + static void foo(foobar&); +}; + +void X::foo(foobar&) +{ +} + +struct Y : public X +{ + static foobar bar; + static void foo(); +}; + +void Y::foo() +{ + X::foo(bar); +} +int* Y::bar() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/conversion/memfn2.C b/gcc/testsuite/g++.dg/conversion/memfn2.C new file mode 100644 index 000000000..c3d76133d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/memfn2.C @@ -0,0 +1,11 @@ +// PR c++/37646 + +struct A +{ + void foo(); + + void bar(int i) + { + void (*p)() = i ? foo : foo; // { dg-error "invalid use of member" } + } +}; diff --git a/gcc/testsuite/g++.dg/conversion/nullptr1.C b/gcc/testsuite/g++.dg/conversion/nullptr1.C new file mode 100644 index 000000000..5e9767a00 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/nullptr1.C @@ -0,0 +1,10 @@ +/* Test for overflow in NULL pointer constant. */ +/* { dg-do compile } */ + +#include + +void *p = 0; + +void *q = 0 * (INT_MAX + 1); // { dg-error "invalid conversion" } +// { dg-warning "integer overflow in expression" "" { target *-*-* } 8 } + diff --git a/gcc/testsuite/g++.dg/conversion/nullptr2.C b/gcc/testsuite/g++.dg/conversion/nullptr2.C new file mode 100644 index 000000000..74ceff49d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/nullptr2.C @@ -0,0 +1,10 @@ +/* Test for enumeration as NULL pointer constant. */ +/* PR c++/14644 */ +/* { dg-do compile } */ + +enum { NULL = 0 }; + +void *p = 0; + +void *q = NULL; // { dg-error "cannot convert" } + diff --git a/gcc/testsuite/g++.dg/conversion/op1.C b/gcc/testsuite/g++.dg/conversion/op1.C new file mode 100644 index 000000000..e0a3e5f46 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op1.C @@ -0,0 +1,11 @@ +class C +{ + template + operator U(); // { dg-message "note" } +}; + +int fn (C c) +{ + return C::operator float(c); // { dg-error "operator float.C" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc/testsuite/g++.dg/conversion/op2.C b/gcc/testsuite/g++.dg/conversion/op2.C new file mode 100644 index 000000000..b40098810 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op2.C @@ -0,0 +1,16 @@ +// PR c++/13907 + +struct A { + operator int & (); + operator const int & () const; +}; + + +void f(int &); +void f(const int &); + + +int main() { + const A x = A(); + f(x); +} diff --git a/gcc/testsuite/g++.dg/conversion/op3.C b/gcc/testsuite/g++.dg/conversion/op3.C new file mode 100644 index 000000000..a01cdcf76 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op3.C @@ -0,0 +1,3 @@ +// PR c++/22256 + +struct node { int* operator int*(); }; // { dg-error "return type specified" } diff --git a/gcc/testsuite/g++.dg/conversion/op4.C b/gcc/testsuite/g++.dg/conversion/op4.C new file mode 100644 index 000000000..5f8214bc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op4.C @@ -0,0 +1,19 @@ +/* PR c++/26698 */ +/* { dg-do compile } */ + +struct X { + int x; + X (int i = 0) : x (i) {} + operator X& (void) const { + return *(new X); + } +}; + +void add_one (X & ref) { /* { dg-error "in passing argument" } */ + ++ ref.x; +} + +void foo() { + X const a (2); + add_one(a); /* { dg-error "invalid initialization of reference of type" } */ +} diff --git a/gcc/testsuite/g++.dg/conversion/op5.C b/gcc/testsuite/g++.dg/conversion/op5.C new file mode 100644 index 000000000..69ef996d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op5.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli +// Origin: PR c++/36407 +// { dg-do compile } + +struct A +{ + A (const A&); +}; + +struct B +{ + operator A&(); +}; + +void +foo (const B& b) +{ + const A a = b; // { dg-error "conversion from 'const B' to non-scalar type 'const A' requested" } +} + diff --git a/gcc/testsuite/g++.dg/conversion/op6.C b/gcc/testsuite/g++.dg/conversion/op6.C new file mode 100644 index 000000000..9aec9f0a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op6.C @@ -0,0 +1,18 @@ +// Origin: PR c++/42766 +// { dg-do compile } + +template class smart_pointer { +public: + operator T* () const { } + operator bool () const { } + operator bool () { } +}; +class Context { }; +typedef smart_pointer ContextP; +class SvnClient { + ~SvnClient(); + ContextP svnContext; +}; +SvnClient::~SvnClient() { + delete svnContext; +} diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem1.C b/gcc/testsuite/g++.dg/conversion/ptrmem1.C new file mode 100644 index 000000000..ed00ea3f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem1.C @@ -0,0 +1,13 @@ +struct S {}; + +void f (int S::*const*); + +typedef int I; + +void f (I S::*const*); + +void g() { + int S::*const* p; + + f(p); +} diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem2.C b/gcc/testsuite/g++.dg/conversion/ptrmem2.C new file mode 100644 index 000000000..d46113db6 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem2.C @@ -0,0 +1,39 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Assorted pointer to data member static cast tests. + +struct A { int x; }; +struct B : A { int x; }; +struct P : A { int x; }; +struct V { int x; }; +struct D : B, virtual V, private P { int x; }; + +// Valid static casts. +int B::*p1 = static_cast(&D::x); +int D::*p2 = static_cast(&B::x); + +// Virtual base class. +int V::*p3 = static_cast(&D::x); // { dg-error "" } +int D::*p4 = static_cast(&V::x); // { dg-error "" } + +// Inaccessible base class. +int P::*p5 = static_cast(&D::x); // { dg-error "" } +int D::*p6 = static_cast(&P::x); // { dg-error "" } + +// Ambiguous base class. +int A::*p7 = static_cast(&D::x); // { dg-error "" } +int D::*p8 = static_cast(&A::x); // { dg-error "" } + +// Valid conversions which increase cv-qualification. +const int B::*p9 = static_cast(&D::x); +const int D::*p10 = static_cast(&B::x); + +// Invalid conversions which decrease cv-qualification. +int B::*p11 = static_cast(p10); // { dg-error "casts away qualifiers" } +int D::*p12 = static_cast(p9); // { dg-error "casts away qualifiers" } + +// Attempts to change member type. +float B::*p13 = static_cast(&D::x); // { dg-error "" } +float D::*p14 = static_cast(&B::x); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem3.C b/gcc/testsuite/g++.dg/conversion/ptrmem3.C new file mode 100644 index 000000000..13005e429 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem3.C @@ -0,0 +1,31 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Assorted pointer to member function static cast tests. + +struct A { int f (); }; +struct B : A { int f (); }; +struct P : A { int f (); }; +struct V { int f (); }; +struct D : B, virtual V, private P { int f (); }; + +// Valid static casts. +int (B::*p1)() = static_cast(&D::f); +int (D::*p2)() = static_cast(&B::f); + +// Virtual base class. +int (V::*p3)() = static_cast(&D::f); // { dg-error "" } +int (D::*p4)() = static_cast(&V::f); // { dg-error "" } + +// Inaccessible base class. +int (P::*p5)() = static_cast(&D::f); // { dg-error "" } +int (D::*p6)() = static_cast(&P::f); // { dg-error "" } + +// Ambiguous base class. +int (A::*p7)() = static_cast(&D::f); // { dg-error "" } +int (D::*p8)() = static_cast(&A::f); // { dg-error "" } + +// Attempts to change member type. +float (B::*p13)() = static_cast(&D::f); // { dg-error "" } +float (D::*p14)() = static_cast(&B::f); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem4.C b/gcc/testsuite/g++.dg/conversion/ptrmem4.C new file mode 100644 index 000000000..fd260df64 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem4.C @@ -0,0 +1,43 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Assorted pointer to data member c-style cast tests. + +struct X {}; +struct A { int x; }; +struct B : A { int x; }; +struct P : A { int x; }; +struct V { int x; }; +struct D : B, virtual V, private P { int x; }; + +// Accessible, non-virtual, non-ambiguous base clas. +int B::*p1 = (int B::*)&D::x; +int D::*p2 = (int D::*)&B::x; + +// Virtual base class. +int V::*p3 = (int V::*)&D::x; // { dg-error "" } +int D::*p4 = (int D::*)&V::x; // { dg-error "" } + +// Inaccessible base class. +int P::*p5 = (int P::*)&D::x; +int D::*p6 = (int D::*)&P::x; + +// Ambiguous base class. +int A::*p7 = (int A::*)&D::x; // { dg-error "" } +int D::*p8 = (int D::*)&A::x; // { dg-error "" } + +// Valid conversions which increase cv-qualification. +const int B::*p9 = (const int B::*)&D::x; +const int D::*p10 = (const int D::*)&B::x; + +// Valid conversions which decrease cv-qualification. +int B::*p11 = (int B::*)p10; +int D::*p12 = (int D::*)p9; + +// Attempts to change member type allowed via reinterpret_cast. +float B::*p13 = (float B::*)&D::x; +float D::*p14 = (float D::*)&B::x; + +// Conversion via unrelated classes allwed via reinterpret_cast. +int X::*p15 = (int X::*)&D::x; diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem5.C b/gcc/testsuite/g++.dg/conversion/ptrmem5.C new file mode 100644 index 000000000..6f06badd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem5.C @@ -0,0 +1,35 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Assorted pointer to member function c-style cast tests. + +struct X {}; +struct A { int f (); }; +struct B : A { int f (); }; +struct P : A { int f (); }; +struct V { int f (); }; +struct D : B, virtual V, private P { int f (); }; + +// Accessible, non-virtual, non-ambiguous base clas. +int (B::*p1)() = (int (B::*)())&D::f; +int (D::*p2)() = (int (D::*)())&B::f; + +// Virtual base class. +int (V::*p3)() = (int (V::*)())&D::f; // { dg-error "" } +int (D::*p4)() = (int (D::*)())&V::f; // { dg-error "" } + +// Inaccessible base class. +int (P::*p5)() = (int (P::*)())&D::f; +int (D::*p6)() = (int (D::*)())&P::f; + +// Ambiguous base class. +int (A::*p7)() = (int (A::*)())&D::f; // { dg-error "" } +int (D::*p8)() = (int (D::*)())&A::f; // { dg-error "" } + +// Attempts to change member type allowed via reinterpret_cast. +float (B::*p13)() = (float (B::*)())&D::f; +float (D::*p14)() = (float (D::*)())&B::f; + +// Conversion via unrelated classes allwed via reinterpret_cast. +int (X::*p15)() = (int (X::*)())&D::f; diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem6.C b/gcc/testsuite/g++.dg/conversion/ptrmem6.C new file mode 100644 index 000000000..a3c0c966c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem6.C @@ -0,0 +1,35 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Assorted pointer to data member implicit cast tests. + +struct A { int x; }; +struct B : A { int x; }; +struct P : A { int x; }; +struct V { int x; }; +struct D : B, virtual V, private P { int x; }; + +// Valid. +int D::*p1 = &B::x; + +// Derived class. +int B::*p2 = &D::x; // { dg-error "" } + +// Virtual base class. +int D::*p3 = &V::x; // { dg-error "" } + +// Inaccessible base class. +int D::*p4 = &P::x; // { dg-error "" } + +// Ambiguous base class. +int D::*p5 = &A::x; // { dg-error "" } + +// Increases cv-qualification. +const int D::*p6 = &B::x; + +// Decreases cv-qualification. +int D::*p7 = static_cast(&D::x); // { dg-error "" } + +// Different member type. +float D::*p8 = &B::x; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem7.C b/gcc/testsuite/g++.dg/conversion/ptrmem7.C new file mode 100644 index 000000000..ad75a52bc --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem7.C @@ -0,0 +1,29 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Assorted pointer to member function implicit cast tests. + +struct A { int f (); }; +struct B : A { int f (); }; +struct P : A { int f (); }; +struct V { int f (); }; +struct D : B, virtual V, private P { int f (); }; + +// Valid. +int (D::*p1)() = &B::f; + +// Derived class. +int (B::*p2)() = &D::f; // { dg-error "" } + +// Virtual base class. +int (D::*p3)() = &V::f; // { dg-error "" } + +// Inaccessible base class. +int (D::*p4)() = &P::f; // { dg-error "" } + +// Ambiguous base class. +int (D::*p5)() = &A::f; // { dg-error "" } + +// Different member type. +float (D::*p6)() = &B::f; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem8.C b/gcc/testsuite/g++.dg/conversion/ptrmem8.C new file mode 100644 index 000000000..95d902fa9 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem8.C @@ -0,0 +1,25 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do run } + +// Test for proper conversion of null pointers to data members. + +struct B1 { + int x; +}; + +struct B2 { + int x; +}; + +struct D : B1, B2 { + int x; +}; + +int main () +{ + int D::*pd = 0; + int B2::*pb2 = 0; + + return pd != pb2; +} diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem9.C b/gcc/testsuite/g++.dg/conversion/ptrmem9.C new file mode 100644 index 000000000..d4a260f92 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem9.C @@ -0,0 +1,26 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild +// { dg-do compile } + +// Test implicit conversion of pointers to member functions appearing as +// operands of the equality operators. + +struct B { }; + +struct BV { }; + +struct D : B, virtual BV { }; + +struct C { }; + +void f () +{ + void (D::*pd) () = 0; + void (B::*pb) () = 0; + void (BV::*pbv) () = 0; + void (C::*pc) () = 0; + + pd == pb; + pd == pbv; // { dg-error "" } + pd == pc; // { dg-error "comparison between distinct pointer-to-member types" } +} diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret1.C b/gcc/testsuite/g++.dg/conversion/reinterpret1.C new file mode 100644 index 000000000..d4567822e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/reinterpret1.C @@ -0,0 +1,6 @@ +// PR c++/15076 + +struct Y { Y(int &); }; + +int v; +Y y1(reinterpret_cast(v)); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret2.C b/gcc/testsuite/g++.dg/conversion/reinterpret2.C new file mode 100644 index 000000000..e9b2328b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/reinterpret2.C @@ -0,0 +1,5 @@ +bool b; + +void f() { + reinterpret_cast(b); +} diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret3.C b/gcc/testsuite/g++.dg/conversion/reinterpret3.C new file mode 100644 index 000000000..62fb91444 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/reinterpret3.C @@ -0,0 +1,7 @@ +struct S {}; + +S s; + +void f() { + reinterpret_cast(s); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/self1.C b/gcc/testsuite/g++.dg/conversion/self1.C new file mode 100644 index 000000000..f36500a9f --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/self1.C @@ -0,0 +1,15 @@ +// PR c++/31419 + +struct B +{ + template + operator T const& () const + { + return 42; + } +}; + +B f() +{ + return B(); +} diff --git a/gcc/testsuite/g++.dg/conversion/simd1.C b/gcc/testsuite/g++.dg/conversion/simd1.C new file mode 100644 index 000000000..fa40b0eaa --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd1.C @@ -0,0 +1,26 @@ +/* { dg-do compile } */ + +/* Test overload resolution of vector types. + From Janis Johnson and Paolo Bonzini, based on PR/16882 */ + +#define vector __attribute__((vector_size(16))) + +vector signed int vld (int a1, const vector signed int *a2) { return *a2; } /* { dg-message "vld|no known conversion" } */ +vector signed short vld (int a1, const vector signed short *a2) { return *a2; } /* { dg-message "vld|no known conversion" } */ + +extern int i; +extern vector signed short vss; +extern vector signed char *vscp; +extern vector signed short *vssp; +extern const vector signed short *cvssp; + +void foo () +{ + vss = vld(i, vscp); /* { dg-error "no matching function for call" } */ + // { dg-message "candidate" "candidate note" { target *-*-* } 19 } + vss = vld(i, vssp); + vss = vld(i, cvssp); +} + +/* Ignore a warning that is irrelevant to the purpose of this test. */ +/* { dg-prune-output ".*GCC vector returned by reference.*" } */ diff --git a/gcc/testsuite/g++.dg/conversion/simd2.C b/gcc/testsuite/g++.dg/conversion/simd2.C new file mode 100644 index 000000000..873e707e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd2.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +/* Test generic operations on vectors. */ + +int __attribute__((vector_size(16))) a, b, c; +int __attribute__((vector_size(8))) d; +void foo() +{ + a = b ^ c; + a = b + c; + a = b - c; + a = b * c; + a = b / c; + a = -b; + a = d + b; /* { dg-error "invalid operands to binary +" } */ +} diff --git a/gcc/testsuite/g++.dg/conversion/simd3.C b/gcc/testsuite/g++.dg/conversion/simd3.C new file mode 100644 index 000000000..8d9626449 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd3.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +typedef int myint; + +float __attribute__((vector_size(16))) b; +int __attribute__((vector_size(16))) d; +myint __attribute__((vector_size(16))) d2; +unsigned int __attribute__((vector_size(16))) e; + +void foo() +{ + b + d; /* { dg-error "invalid operands to binary" } */ + d += e; /* { dg-message "use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts.*cannot convert '__vector.4. unsigned int' to '__vector.4. int' in assignment" } */ + d2 += d; +} diff --git a/gcc/testsuite/g++.dg/conversion/simd4.C b/gcc/testsuite/g++.dg/conversion/simd4.C new file mode 100644 index 000000000..f8f7f2e45 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd4.C @@ -0,0 +1,34 @@ +// PR c++/29734 +// { dg-do compile } +// { dg-options "" } + +int t; +float u; +int __attribute__((vector_size (8))) v; +float __attribute__((vector_size (8))) w; +int b[10]; + +void +foo () +{ + b[t]; + b[u]; // { dg-error "invalid types" } + b[v]; // { dg-error "invalid types" } + b[w]; // { dg-error "invalid types" } + t[b]; + u[b]; // { dg-error "invalid types" } + v[b]; // { dg-error "invalid types" } + w[b]; // { dg-error "invalid types" } + new int[t]; + new int[u]; // { dg-error "new-declarator must have integral" } + new int[v]; // { dg-error "new-declarator must have integral" } + new int[w]; // { dg-error "new-declarator must have integral" } + switch (t) { default: break; } + switch (u) { default: break; } // { dg-error "switch quantity not an integer" } + switch (v) { default: break; } // { dg-error "switch quantity not an integer" } + switch (w) { default: break; } // { dg-error "switch quantity not an integer" } + t = ~t; + u = ~u; // { dg-error "wrong type argument to bit-complement" } + v = ~v; + w = ~w; // { dg-error "wrong type argument to bit-complement" } +} diff --git a/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C b/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C new file mode 100644 index 000000000..3fa8e418e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C @@ -0,0 +1,15 @@ +// Copyright (C) 2002 Free Software Foundation +// Contributed by Gabriel Dos Reis + +struct A { + virtual void f(const A* a) = 0; +}; + +struct B : virtual A { + virtual void f(const A* a); +}; + +void B::f(const A* a) +{ + static_cast(*a); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/void1.C b/gcc/testsuite/g++.dg/conversion/void1.C new file mode 100644 index 000000000..120fc0e1d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/void1.C @@ -0,0 +1,5 @@ +// PR c++/27422 +// { dg-do compile } + +void foo(void i); // { dg-error "incomplete type|invalid use" } +void bar() { foo(0); } -- cgit v1.2.3