aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/conversion
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.dg/conversion
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/conversion')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cast1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond2.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond3.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/cond6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op3.C3
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op4.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C39
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C35
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C7
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd3.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/simd4.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C5
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C16
63 files changed, 1096 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/access1.C
new file mode 100644
index 000000000..f187e63a9
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig1.C
new file mode 100644
index 000000000..85ea1d25f
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C
new file mode 100644
index 000000000..a9d9d699c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ambig2.C
@@ -0,0 +1,18 @@
+// PR c++/57948
+
+struct Base { };
+struct Derived : Base
+{
+ struct Derived2 : Base
+ {
+ struct ConvertibleToBothDerivedRef
+ {
+ operator Derived&();
+ operator Derived2&();
+ void bind_lvalue_to_conv_lvalue_ambig(ConvertibleToBothDerivedRef both)
+ {
+ Base &br1 = both; // { dg-error "ambiguous" }
+ }
+ };
+ };
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/base1.C
new file mode 100644
index 000000000..e236504ae
--- /dev/null
+++ b/gcc-4.9/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 <class T>
+void eval (const TexCoords &coords)
+{
+ const Pos &pos = coords.pos;
+ pos.x;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield1.C
new file mode 100644
index 000000000..a660e7950
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield10.C
new file mode 100644
index 000000000..f75504e0d
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield11.C
new file mode 100644
index 000000000..e36539c64
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield2.C
new file mode 100644
index 000000000..aa60d3505
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield3.C
new file mode 100644
index 000000000..a897bf59e
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield4.C
new file mode 100644
index 000000000..75fe3016e
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield5.C
new file mode 100644
index 000000000..b931ec97c
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield6.C
new file mode 100644
index 000000000..79664ab7d
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield7.C
new file mode 100644
index 000000000..1080168dc
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield8.C
new file mode 100644
index 000000000..dbc62fade
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/bitfield9.C
new file mode 100644
index 000000000..998dd4873
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/cast1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast1.C
new file mode 100644
index 000000000..f90b42165
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/cast2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C
new file mode 100644
index 000000000..ac8329730
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast2.C
@@ -0,0 +1,9 @@
+// Origin: PR c++/42260
+// { dg-do compile }
+
+struct A
+{
+ template<typename T> operator T*();
+};
+
+int i = *A();// { dg-error "no match" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cast3.C
new file mode 100644
index 000000000..43287a1eb
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond1.C
new file mode 100644
index 000000000..16184ccb4
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/cond2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond2.C
new file mode 100644
index 000000000..d31de33e2
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/cond3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond3.C
new file mode 100644
index 000000000..da052d453
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/cond4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C
new file mode 100644
index 000000000..3bd64763a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond4.C
@@ -0,0 +1,31 @@
+// Origin: PR c++/45383
+// { dg-do run }
+
+struct null {
+ null() {}
+ template<class T>
+ operator T*() const {
+ return 0;
+ }
+
+ template<class C, class T>
+ 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-4.9/gcc/testsuite/g++.dg/conversion/cond6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/cond6.C
new file mode 100644
index 000000000..8c05e1b14
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/const1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C
new file mode 100644
index 000000000..5e43bc063
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const1.C
@@ -0,0 +1,5 @@
+// PR c++/14211
+
+void f(char *str) {
+ char *& m = const_cast<char *>(str); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const2.C
new file mode 100644
index 000000000..fd2be1f44
--- /dev/null
+++ b/gcc-4.9/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<dm>(bp); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C
new file mode 100644
index 000000000..faa9f810c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/const3.C
@@ -0,0 +1,7 @@
+// PR c++/18177
+
+void foo()
+{
+ X; // { dg-error "" }
+ const_cast<int&>(X);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195-1.C
new file mode 100644
index 000000000..ca38580e5
--- /dev/null
+++ b/gcc-4.9/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 <nathan@codesourcery.com>
+
+// 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 <PF>(pv);
+ pv = reinterpret_cast <PV>(pf);
+
+ /* the following two might or might not be ok with 195. */
+ pf = reinterpret_cast <PF>(po);
+ po = reinterpret_cast <PO>(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-4.9/gcc/testsuite/g++.dg/conversion/dr195.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C
new file mode 100644
index 000000000..cb26623e1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dr195.C
@@ -0,0 +1,32 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com>
+
+// DR 195 was about allowing conversions between function and object
+// pointers under some circumstances. The issue got resolved for C++11,
+// which, in 5.2.10 p8 says that: "Converting a function pointer to an
+// object pointer type or vice versa is conditionally-supported."
+
+// This checks we don't warn anymore with -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 <PF>(pv);
+ pv = reinterpret_cast <PV>(pf);
+
+ /* the following two might or might not be ok with 195. */
+ pf = reinterpret_cast <PF>(po);
+ po = reinterpret_cast <PO>(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-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C
new file mode 100644
index 000000000..a781cbaa3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/dynamic1.C
@@ -0,0 +1,15 @@
+// PR c++/10385
+// Origin: <douglas@coc.ufrj.br>
+// { dg-do compile }
+
+struct A
+{
+ void foo();
+};
+
+A& bar();
+
+void baz()
+{
+ dynamic_cast<A&>( bar().foo ); // { dg-error "cannot dynamic_cast" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/enum1.C
new file mode 100644
index 000000000..6ea8cadb6
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/err-recover1.C
new file mode 100644
index 000000000..97237893d
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn1.C
new file mode 100644
index 000000000..da2fb0fad
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/memfn2.C
new file mode 100644
index 000000000..c3d76133d
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C
new file mode 100644
index 000000000..5e9767a00
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr1.C
@@ -0,0 +1,10 @@
+/* Test for overflow in NULL pointer constant. */
+/* { dg-do compile } */
+
+#include <limits.h>
+
+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-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/nullptr2.C
new file mode 100644
index 000000000..74ceff49d
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/op1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C
new file mode 100644
index 000000000..e0a3e5f46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op1.C
@@ -0,0 +1,11 @@
+class C
+{
+ template<typename U>
+ 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-4.9/gcc/testsuite/g++.dg/conversion/op2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op2.C
new file mode 100644
index 000000000..b40098810
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/op3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op3.C
new file mode 100644
index 000000000..a01cdcf76
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/op4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op4.C
new file mode 100644
index 000000000..7ef4b6a0c
--- /dev/null
+++ b/gcc-4.9/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-message "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-4.9/gcc/testsuite/g++.dg/conversion/op5.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C
new file mode 100644
index 000000000..69ef996d5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op5.C
@@ -0,0 +1,20 @@
+// Contributed by Dodji Seketeli <dseketel@redhat.com>
+// 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-4.9/gcc/testsuite/g++.dg/conversion/op6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C
new file mode 100644
index 000000000..9aec9f0a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/op6.C
@@ -0,0 +1,18 @@
+// Origin: PR c++/42766
+// { dg-do compile }
+
+template<class T> class smart_pointer {
+public:
+ operator T* () const { }
+ operator bool () const { }
+ operator bool () { }
+};
+class Context { };
+typedef smart_pointer<Context> ContextP;
+class SvnClient {
+ ~SvnClient();
+ ContextP svnContext;
+};
+SvnClient::~SvnClient() {
+ delete svnContext;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem1.C
new file mode 100644
index 000000000..ed00ea3f7
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C
new file mode 100644
index 000000000..d46113db6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem2.C
@@ -0,0 +1,39 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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<int B::*>(&D::x);
+int D::*p2 = static_cast<int D::*>(&B::x);
+
+// Virtual base class.
+int V::*p3 = static_cast<int V::*>(&D::x); // { dg-error "" }
+int D::*p4 = static_cast<int D::*>(&V::x); // { dg-error "" }
+
+// Inaccessible base class.
+int P::*p5 = static_cast<int P::*>(&D::x); // { dg-error "" }
+int D::*p6 = static_cast<int D::*>(&P::x); // { dg-error "" }
+
+// Ambiguous base class.
+int A::*p7 = static_cast<int A::*>(&D::x); // { dg-error "" }
+int D::*p8 = static_cast<int D::*>(&A::x); // { dg-error "" }
+
+// Valid conversions which increase cv-qualification.
+const int B::*p9 = static_cast<const int B::*>(&D::x);
+const int D::*p10 = static_cast<const int D::*>(&B::x);
+
+// Invalid conversions which decrease cv-qualification.
+int B::*p11 = static_cast<int B::*>(p10); // { dg-error "casts away qualifiers" }
+int D::*p12 = static_cast<int D::*>(p9); // { dg-error "casts away qualifiers" }
+
+// Attempts to change member type.
+float B::*p13 = static_cast<float B::*>(&D::x); // { dg-error "" }
+float D::*p14 = static_cast<float D::*>(&B::x); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C
new file mode 100644
index 000000000..13005e429
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem3.C
@@ -0,0 +1,31 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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<int (B::*)()>(&D::f);
+int (D::*p2)() = static_cast<int (D::*)()>(&B::f);
+
+// Virtual base class.
+int (V::*p3)() = static_cast<int (V::*)()>(&D::f); // { dg-error "" }
+int (D::*p4)() = static_cast<int (D::*)()>(&V::f); // { dg-error "" }
+
+// Inaccessible base class.
+int (P::*p5)() = static_cast<int (P::*)()>(&D::f); // { dg-error "" }
+int (D::*p6)() = static_cast<int (D::*)()>(&P::f); // { dg-error "" }
+
+// Ambiguous base class.
+int (A::*p7)() = static_cast<int (A::*)()>(&D::f); // { dg-error "" }
+int (D::*p8)() = static_cast<int (D::*)()>(&A::f); // { dg-error "" }
+
+// Attempts to change member type.
+float (B::*p13)() = static_cast<float (B::*)()>(&D::f); // { dg-error "" }
+float (D::*p14)() = static_cast<float (D::*)()>(&B::f); // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C
new file mode 100644
index 000000000..fd260df64
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem4.C
@@ -0,0 +1,43 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C
new file mode 100644
index 000000000..6f06badd7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem5.C
@@ -0,0 +1,35 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C
new file mode 100644
index 000000000..a3c0c966c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem6.C
@@ -0,0 +1,35 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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<const int D::*>(&D::x); // { dg-error "" }
+
+// Different member type.
+float D::*p8 = &B::x; // { dg-error "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C
new file mode 100644
index 000000000..ad75a52bc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem7.C
@@ -0,0 +1,29 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C
new file mode 100644
index 000000000..95d902fa9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem8.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C
new file mode 100644
index 000000000..d4a260f92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ptrmem9.C
@@ -0,0 +1,26 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { 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-4.9/gcc/testsuite/g++.dg/conversion/ref1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C
new file mode 100644
index 000000000..c0b368434
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/ref1.C
@@ -0,0 +1,9 @@
+// PR c++/60345
+
+struct C {};
+struct J : C {};
+struct A {
+ operator J* ();
+};
+A p;
+C* const& q = p;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C
new file mode 100644
index 000000000..aa55f6f4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret1.C
@@ -0,0 +1,6 @@
+// PR c++/15076
+
+struct Y { Y(int &); };
+
+int v;
+Y y1(reinterpret_cast<int>(v));
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C
new file mode 100644
index 000000000..e9b2328b7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret2.C
@@ -0,0 +1,5 @@
+bool b;
+
+void f() {
+ reinterpret_cast<void*>(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C
new file mode 100644
index 000000000..62fb91444
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret3.C
@@ -0,0 +1,7 @@
+struct S {};
+
+S s;
+
+void f() {
+ reinterpret_cast<const S>(s); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C
new file mode 100644
index 000000000..71575a1ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/reinterpret4.C
@@ -0,0 +1,4 @@
+// PR c++/51379
+
+unsigned long t1 = 1;
+unsigned long t2 = reinterpret_cast<unsigned long>(t1);
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C
new file mode 100644
index 000000000..f36500a9f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/self1.C
@@ -0,0 +1,15 @@
+// PR c++/31419
+
+struct B
+{
+ template<typename T>
+ operator T const& () const
+ {
+ return 42;
+ }
+};
+
+B f()
+{
+ return B();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C
new file mode 100644
index 000000000..522d8b547
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd1.C
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-msse2" { target { i?86-*-* x86_64-*-* } } } */
+
+/* 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 *-*-* } 20 }
+ 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-4.9/gcc/testsuite/g++.dg/conversion/simd2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd2.C
new file mode 100644
index 000000000..873e707e0
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/simd3.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd3.C
new file mode 100644
index 000000000..8d9626449
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/simd4.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/simd4.C
new file mode 100644
index 000000000..f8f7f2e45
--- /dev/null
+++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C
new file mode 100644
index 000000000..3fa8e418e
--- /dev/null
+++ b/gcc-4.9/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 <gdr@integrable-solutions.net>
+
+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<const B&>(*a); // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void1.C
new file mode 100644
index 000000000..120fc0e1d
--- /dev/null
+++ b/gcc-4.9/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); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C
new file mode 100644
index 000000000..9bd6d9f4c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/conversion/void2.C
@@ -0,0 +1,16 @@
+// PR c++/54165
+
+struct A
+{
+ template<typename T>
+ operator T()
+ {
+ T l[];
+ }
+};
+
+int main()
+{
+ A a;
+ (void)a;
+}