diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.dg/expr | |
download | cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2 cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
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.
Diffstat (limited to 'gcc/testsuite/g++.dg/expr')
91 files changed, 1453 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/expr/anew1.C b/gcc/testsuite/g++.dg/expr/anew1.C new file mode 100644 index 000000000..d7a428880 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew1.C @@ -0,0 +1,27 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + + +#include <new> +#include <stdlib.h> +#include <string.h> + +int* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (int)); + memset (p, 0xff, n * sizeof(int)); + return new (p) int[n](); +} + +int main() +{ + const int n = 17; + int* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i] != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/anew2.C b/gcc/testsuite/g++.dg/expr/anew2.C new file mode 100644 index 000000000..fbf2152d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew2.C @@ -0,0 +1,27 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + + +#include <new> +#include <stdlib.h> +#include <string.h> + +double* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (double)); + memset (p, 0xff, n * sizeof(double)); + return new (p) double[n](); +} + +int main() +{ + const int n = 17; + double* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i] != 0.0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/anew3.C b/gcc/testsuite/g++.dg/expr/anew3.C new file mode 100644 index 000000000..9bb64ea4e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew3.C @@ -0,0 +1,32 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + +#include <new> +#include <stdlib.h> +#include <string.h> + +struct X +{ + int a; + double b; +}; + +X* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (X)); + memset (p, 0xff, n * sizeof(X)); + return new (p) X[n](); +} + +int main() +{ + const int n = 17; + X* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i].a != 0 || p[i].b != 0.0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/anew4.C b/gcc/testsuite/g++.dg/expr/anew4.C new file mode 100644 index 000000000..4ce1d8899 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew4.C @@ -0,0 +1,44 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + +#include <new> +#include <stdlib.h> +#include <string.h> + +struct B +{ + B(); + int n; +}; + +B::B() +{ + n = 137; +} + + +struct D : public B +{ + double x; +}; + + +D* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (D)); + memset (p, 0xff, n * sizeof(D)); + return new (p) D[n](); +} + +int main() +{ + const int n = 17; + D* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i].n != 137 || p[i].x != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/assign1.C b/gcc/testsuite/g++.dg/expr/assign1.C new file mode 100644 index 000000000..7eb37e523 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/assign1.C @@ -0,0 +1,34 @@ +// { dg-do run } + +// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com> +// Origin: Tasso Karkanis <Tasso.Karkanis@rogers.com> +// PR c++/13387. Clobbered tail padding of base + +inline void *operator new (__SIZE_TYPE__, void *ptr) +{ + return ptr; +} + +struct Base { + Base() : i(0), c(0) {} + int i; + char c; +}; + +struct Sub : Base { + Sub () : d(0) {} + char d; +}; + +int main() { + Sub sub; + char base_alias[sizeof (Base)]; + Base *base; + + for (unsigned ix = sizeof base_alias; ix--;) + base_alias[ix] = 0x55; + base = new (&base_alias) Base (); + + static_cast <Base &> (sub) = *base; + return sub.d; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield1.C b/gcc/testsuite/g++.dg/expr/bitfield1.C new file mode 100644 index 000000000..f3d47417b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield1.C @@ -0,0 +1,12 @@ +// PR c++/27505 + +struct s { + bool field:8; +}; + +void +foo (struct s *p) +{ + if (!p->field) + ; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield10.C b/gcc/testsuite/g++.dg/expr/bitfield10.C new file mode 100644 index 000000000..0a6581e32 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield10.C @@ -0,0 +1,16 @@ +// PR c++/37146 +// { dg-do compile } + +enum E { E0 = 0, E1 = 'E' }; + +struct S +{ + E s0 : 8; + enum E foo (bool, E); +}; + +E +S::foo (bool a, E b) +{ + return a ? s0 : b; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield11.C b/gcc/testsuite/g++.dg/expr/bitfield11.C new file mode 100644 index 000000000..bab303ef3 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield11.C @@ -0,0 +1,13 @@ +// PR c++/37819 +// { dg-do compile } + +struct A +{ + unsigned int a : 1; +}; + +bool +foo (A *x, A *y) +{ + x->a = y ? y->a : true; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield2.C b/gcc/testsuite/g++.dg/expr/bitfield2.C new file mode 100644 index 000000000..659931530 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield2.C @@ -0,0 +1,9 @@ +// PR c++/27979 + +class Ast +{ + enum AstKind { }; + const AstKind kind : 8; + void foo(AstKind k) { } + void bar(void) { foo(kind); } +}; diff --git a/gcc/testsuite/g++.dg/expr/bitfield3.C b/gcc/testsuite/g++.dg/expr/bitfield3.C new file mode 100644 index 000000000..3221263a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield3.C @@ -0,0 +1,12 @@ +// PR c++/30274 + +struct S { + bool x : 4; +}; + +S s; + +void f() { + s.x--; // { dg-error "Boolean expression" } + --s.x; // { dg-error "Boolean expression" } +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield4.C b/gcc/testsuite/g++.dg/expr/bitfield4.C new file mode 100644 index 000000000..d824964e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield4.C @@ -0,0 +1,19 @@ +// PR c++/30274 +// { dg-do link } + +struct S { + bool x : 4; +}; + +S s; + +template <typename T> +void f(T); + +template <> +void f(bool) {} + +int main() { + f(s.x++); + f(++s.x); +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield5.C b/gcc/testsuite/g++.dg/expr/bitfield5.C new file mode 100644 index 000000000..3d18e159c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield5.C @@ -0,0 +1,17 @@ +// PR c++/30274 +// { dg-do run } + +struct S { + bool x : 4; +}; + +S s; + +int main() { + s.x++; + if (s.x != 1) + return 1; + ++s.x; + if (s.x != 1) + return 2; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield6.C b/gcc/testsuite/g++.dg/expr/bitfield6.C new file mode 100644 index 000000000..6f6d559a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield6.C @@ -0,0 +1,11 @@ +// PR c++/30274 + +struct S { + bool x : 4; +}; + +S s; + +void f() { + ++s.x = false; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield7.C b/gcc/testsuite/g++.dg/expr/bitfield7.C new file mode 100644 index 000000000..d274e3e98 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield7.C @@ -0,0 +1,8 @@ +// PR c++/31273 + +enum E { e }; +struct S { + E v:5; +}; +S s; +int main() { if (!s.v) return 0; } diff --git a/gcc/testsuite/g++.dg/expr/bitfield8.C b/gcc/testsuite/g++.dg/expr/bitfield8.C new file mode 100644 index 000000000..566109cdd --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield8.C @@ -0,0 +1,24 @@ +// PR c++/31513 +// { dg-do run } + +extern "C" void abort(); + +struct tree_type { + unsigned int precision : 9; +}; + +void bork(unsigned int i) { + if (i != 7) + abort(); +} + +void foo(struct tree_type *t) +{ + bork(t->precision); +} + +int main() { + tree_type t; + t.precision = 7; + foo(&t); +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield9.C b/gcc/testsuite/g++.dg/expr/bitfield9.C new file mode 100644 index 000000000..177f65b88 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield9.C @@ -0,0 +1,26 @@ +// PR c++/32346 +// { dg-do run } +// { dg-options "-Wno-overflow" } + +extern "C" void abort(); + +struct S { + long long i : 32; +}; + +void f(int i, int j) { + if (i != 0xabcdef01) + abort(); + if (j != 0) + abort(); +} + +void g(S s) { + f(s.i, 0); +} + +int main() { + S s; + s.i = 0xabcdef01; + g(s); +} diff --git a/gcc/testsuite/g++.dg/expr/bool1.C b/gcc/testsuite/g++.dg/expr/bool1.C new file mode 100644 index 000000000..bfb40e330 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool1.C @@ -0,0 +1,21 @@ +// { dg-do run } +// PR C++/29295 +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + +extern "C" void abort(); +typedef bool my_bool; +int main() +{ + my_bool b = false; + int i; + + b++; + b++; + i = b; + if (i != 1) + abort (); + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/expr/bool2.C b/gcc/testsuite/g++.dg/expr/bool2.C new file mode 100644 index 000000000..39d93c0af --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + + +typedef bool my_bool; +int main() +{ + my_bool b = false; + b--; // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/bool3.C b/gcc/testsuite/g++.dg/expr/bool3.C new file mode 100644 index 000000000..61669e27b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool3.C @@ -0,0 +1,21 @@ +// { dg-do run } +// PR C++/29295 +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + +extern "C" void abort(); +typedef volatile bool my_bool; +int main() +{ + my_bool b = false; + int i; + + b++; + b++; + i = b; + if (i != 1) + abort (); + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/expr/bool4.C b/gcc/testsuite/g++.dg/expr/bool4.C new file mode 100644 index 000000000..dce51ec33 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool4.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + + +typedef volatile bool my_bool; +int main() +{ + my_bool b = false; + b--; // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/bound-mem-fun.C b/gcc/testsuite/g++.dg/expr/bound-mem-fun.C new file mode 100644 index 000000000..b31bba13c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bound-mem-fun.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/38228 +// { dg-do compile } + +struct A +{ + A (); + template<typename T> A(T); +}; + +struct B +{ + int foo(); +}; + +A a = B().*(&B::foo); // { dg-error "invalid use of non-static member function" } + + diff --git a/gcc/testsuite/g++.dg/expr/call1.C b/gcc/testsuite/g++.dg/expr/call1.C new file mode 100644 index 000000000..42d18db56 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call1.C @@ -0,0 +1,16 @@ +namespace NS_1 { + struct A {}; + struct foo {}; +} + +namespace NS_2 { + template <typename T> void foo(T); + + template <typename T> + void bar() { + NS_1::A a; + NS_2::foo(a); + } + + template void bar<int>(); +} diff --git a/gcc/testsuite/g++.dg/expr/call2.C b/gcc/testsuite/g++.dg/expr/call2.C new file mode 100644 index 000000000..3b7398a8b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 11 Sep 2003 <nathan@codesourcery.com> +// Origin: Wolfgang Bangerth <bangerth@dealii.org> +// PR c++/12184. ICE + +class C; +class D; +bool mm(D); + +void g(C& f) { + mm(f); // { dg-error "parameter" "" } +} diff --git a/gcc/testsuite/g++.dg/expr/call3.C b/gcc/testsuite/g++.dg/expr/call3.C new file mode 100644 index 000000000..13bca7170 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call3.C @@ -0,0 +1,12 @@ +// PR c++/26036 +// Origin: <ben@pc-doctor.com> +// { dg-do compile } + +struct A +{ + int i; +}; + +A foo(int); /* { dg-message "note: declared here" } */ + +int j = foo().i; // { dg-error "too few arguments" } diff --git a/gcc/testsuite/g++.dg/expr/call4.C b/gcc/testsuite/g++.dg/expr/call4.C new file mode 100644 index 000000000..b4f2d60be --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call4.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2007 <nathan@codesourcery.com> + +// Origin: Danny Boelens <danny.boelens@artwork-systems.com> +// PR 32839. Default arguments propagated through the type system to +// an indirect call. + +template<typename T> +struct TPL +{ + enum Whatever {e1, e2}; + + static void Quux (int i = e1 | e2); +}; + +template <typename F> +void DoIt (F fun) +{ + fun (); // { dg-error "too few arguments" } +} + +void Foo () +{ + DoIt (&TPL<int>::Quux); +} diff --git a/gcc/testsuite/g++.dg/expr/call5.C b/gcc/testsuite/g++.dg/expr/call5.C new file mode 100644 index 000000000..023ad81f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call5.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2007 <nathan@codesourcery.com> + +// PR 32839. Default arguments propagated through the type system to +// an indirect call. + +void Quux (int i = 0); +void Baz (int i); + +void Foo () +{ + __typeof (Quux) *q = Baz; + + q (); // { dg-error "too few arguments" } +} + + diff --git a/gcc/testsuite/g++.dg/expr/cast1.C b/gcc/testsuite/g++.dg/expr/cast1.C new file mode 100644 index 000000000..ee1adcc3d --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast1.C @@ -0,0 +1,3 @@ +struct S; // { dg-error "forward" } + +void f(S* p) { ((S) (*p)); } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/expr/cast10.C b/gcc/testsuite/g++.dg/expr/cast10.C new file mode 100644 index 000000000..cd3e0fc3c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast10.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// This used to error out because we would try to convert m to a short. + + +struct a {}; +void b() { + int a::*m; + a *c; + short p = reinterpret_cast<char*>(&(c->*m)) - reinterpret_cast<char*>(c); +} diff --git a/gcc/testsuite/g++.dg/expr/cast2.C b/gcc/testsuite/g++.dg/expr/cast2.C new file mode 100644 index 000000000..1ccda2b48 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast2.C @@ -0,0 +1,5 @@ +void (*p)(); + +void f() { + (void *)p; // { dg-warning "forbids cast" } +} diff --git a/gcc/testsuite/g++.dg/expr/cast3.C b/gcc/testsuite/g++.dg/expr/cast3.C new file mode 100644 index 000000000..2ca56c269 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +enum MyState +{ + QUIT = 0, + START, + STOP, + PAUSE +}; + +double GetDouble() +{ + return 1.0; +} + +int main() +{ + MyState the_state; + + the_state = (MyState)GetDouble(); // { dg-bogus "invalid cast" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/cast4.C b/gcc/testsuite/g++.dg/expr/cast4.C new file mode 100644 index 000000000..e9f529b11 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast4.C @@ -0,0 +1,25 @@ +// { dg-do run } +// PR c++/22132 + +extern "C" void abort (); + +struct foo { + int a; + int b; +}; + +class Foobar : public foo { +public: + Foobar() { a = 1; b = 2; } + virtual ~Foobar() {} +}; + +Foobar obj; +const Foobar* objPtr = &obj; +foo* f = (foo*)objPtr; + +int main () { + if (f->a != 1 || f->b != 2) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/expr/cast6.C b/gcc/testsuite/g++.dg/expr/cast6.C new file mode 100644 index 000000000..434a04669 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast6.C @@ -0,0 +1,6 @@ +void f(int &); +void f(const int &); +int main() { + volatile int x = 2; + f((int)x); +} diff --git a/gcc/testsuite/g++.dg/expr/cast7.C b/gcc/testsuite/g++.dg/expr/cast7.C new file mode 100644 index 000000000..c948919e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast7.C @@ -0,0 +1,13 @@ +// PR c++/27177 + +struct X {}; + +struct Y : virtual X {}; +struct Z : virtual X {}; + +struct A : Y, Z {}; + +struct B : A +{ + static const int i = sizeof((Z*)(B*)0); +}; diff --git a/gcc/testsuite/g++.dg/expr/cast8.C b/gcc/testsuite/g++.dg/expr/cast8.C new file mode 100644 index 000000000..9f1ce36f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast8.C @@ -0,0 +1,11 @@ +// PR c++/29886 + +struct A { + static int x[1]; +}; + +void foo(int i) +{ + if (int(A::x[i])) {} +} + diff --git a/gcc/testsuite/g++.dg/expr/cast9.C b/gcc/testsuite/g++.dg/expr/cast9.C new file mode 100644 index 000000000..150183a38 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast9.C @@ -0,0 +1,12 @@ +// PR c++/27177 + +struct Z {}; +struct A : Z {}; + +Z* implicitToZ (Z*); + +struct B : A +{ + static const int i = sizeof(implicitToZ((B*)0)); +}; + diff --git a/gcc/testsuite/g++.dg/expr/comma1.C b/gcc/testsuite/g++.dg/expr/comma1.C new file mode 100644 index 000000000..5424ce1a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/comma1.C @@ -0,0 +1,21 @@ +// { dg-do run } + +extern "C" void abort (); + +struct gtst +{ + unsigned char data[2]; +}; + +static struct gtst s; + +int main(int argc, char *argv[]) +{ + unsigned char * pc; + struct gtst * ps; + ps = &s; + pc = (ps->data[0]='A', ps->data); + if (&s.data[0] != pc) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/cond1.C b/gcc/testsuite/g++.dg/expr/cond1.C new file mode 100644 index 000000000..8fb3c0f4f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond1.C @@ -0,0 +1,28 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com> + +// PR 7209. We didn't SAVE_EXPR in the right place + +char a[2][1][16]={ + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}}; + +int f() {return 0;} + +char * Foo (int d) +{ + char *c1; + + c1=a[d==0 ? 0 : 1][f()]; + + return c1; +} + +int main () +{ + if (Foo (0) != (void *)a) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/cond2.C b/gcc/testsuite/g++.dg/expr/cond2.C new file mode 100644 index 000000000..68a26a22f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond2.C @@ -0,0 +1,12 @@ +struct Term { }; +struct Boolean : Term { + explicit Boolean(bool); +}; +struct IsZero : Term { + Term *eval(); +}; +Term* +IsZero::eval() +{ + return true ? new Boolean(false) : this; // { dg-error "conditional expression" } +} diff --git a/gcc/testsuite/g++.dg/expr/cond3.C b/gcc/testsuite/g++.dg/expr/cond3.C new file mode 100644 index 000000000..50a4d9a13 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond3.C @@ -0,0 +1,6 @@ +const int i = 7; +const int j = 3; + +void f(bool b) { + &(b ? i : j); +} diff --git a/gcc/testsuite/g++.dg/expr/cond4.C b/gcc/testsuite/g++.dg/expr/cond4.C new file mode 100644 index 000000000..fff5c8b18 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond4.C @@ -0,0 +1,16 @@ +// PR c++/13971 + +struct QChar { + static const QChar null; +}; +struct QCharRef { + operator QChar() const; +}; +struct QString { + QCharRef operator[](int i); +}; + +QChar fillParagraph(QString s, int psi) { + return psi ? QChar::null : s[psi]; +} + diff --git a/gcc/testsuite/g++.dg/expr/cond6.C b/gcc/testsuite/g++.dg/expr/cond6.C new file mode 100644 index 000000000..943aa85a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond6.C @@ -0,0 +1,24 @@ +// { dg-do run } + +extern "C" void abort (); + +struct B { + B() {} + B(const B& b) { abort (); } +}; + +struct D : public B { + D() {} + D(const D& d) : B() {} +}; + +D d; +B b; + +D f() { + return d; +} + +int main () { + b = (true ? f() : b); +} diff --git a/gcc/testsuite/g++.dg/expr/cond7.C b/gcc/testsuite/g++.dg/expr/cond7.C new file mode 100644 index 000000000..05e8eab44 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond7.C @@ -0,0 +1,12 @@ +// PR c++/19148 + +struct QChar { + QChar (char c); + QChar (const QChar &); + unsigned short ucs; +}; + +void f(QChar *uc, unsigned short ch, QChar replacement) +{ + *uc++ = ((ch) ? QChar((1)) : replacement); +} diff --git a/gcc/testsuite/g++.dg/expr/cond8.C b/gcc/testsuite/g++.dg/expr/cond8.C new file mode 100644 index 000000000..11708ec0f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond8.C @@ -0,0 +1,13 @@ +// PR c++/22434 +// { dg-options "" } + +struct A +{ + A(void*); // { dg-error "initializing" } + ~A(); +}; + +void foo(const int i, bool b) +{ + b ? A(0) : i; // { dg-error "conversion" } +} diff --git a/gcc/testsuite/g++.dg/expr/cond9.C b/gcc/testsuite/g++.dg/expr/cond9.C new file mode 100644 index 000000000..e8e1397c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond9.C @@ -0,0 +1,12 @@ +// PR c++/27666 + +struct A { // { dg-message "A" } + A(int); // { dg-message "A" } +}; + +void foo(volatile A a) { + 1 ? a : 0; // { dg-error "match|temporary" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } + 1 ? 0 : a; // { dg-error "match|temporary" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } +} diff --git a/gcc/testsuite/g++.dg/expr/copy1.C b/gcc/testsuite/g++.dg/expr/copy1.C new file mode 100644 index 000000000..57036d3f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/copy1.C @@ -0,0 +1,28 @@ +// PR c++/14035 +// { dg-do run } + +extern "C" void abort(); + +struct Blob { + int x, y; + Blob() { } + Blob(const Blob &b) { abort (); } +}; +struct Blobby : public Blob { }; + +struct Wooly { + operator const Blobby & () + { + return myBlobby; + } + Blobby myBlobby; +}; + +void catcher(const Blob &blo) +{ } + +int main() +{ + Wooly wooly; + catcher((const Blob &)wooly); +} diff --git a/gcc/testsuite/g++.dg/expr/crash-1.C b/gcc/testsuite/g++.dg/expr/crash-1.C new file mode 100644 index 000000000..d8d689fd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/crash-1.C @@ -0,0 +1,15 @@ +// C++ PR/10476 +// Origin: larsbj@gullik.net and bangerth@dealii.org + + +struct X { + X(); + X(const X& __str); +}; +X const bar(); +void foo() +{ + X y; + (true ? y : bar()); +} + diff --git a/gcc/testsuite/g++.dg/expr/crash2.C b/gcc/testsuite/g++.dg/expr/crash2.C new file mode 100644 index 000000000..5379bb159 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/crash2.C @@ -0,0 +1,14 @@ +// PR c++/14267 + +class foo { +public: static int& x; +}; +int temp; +int& foo::x=temp; + +int main() { + int x = 3; + &foo::x = x; // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/dtor1.C b/gcc/testsuite/g++.dg/expr/dtor1.C new file mode 100644 index 000000000..0775a93c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor1.C @@ -0,0 +1,7 @@ +class Foo; // { dg-error "" } + +void +bar(void* p) +{ + static_cast<Foo*>(p)->~Foo(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/dtor2.C b/gcc/testsuite/g++.dg/expr/dtor2.C new file mode 100644 index 000000000..5f372424e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor2.C @@ -0,0 +1,6 @@ +typedef const int I; +int i; + +void f() { + i.I::~I(); +} diff --git a/gcc/testsuite/g++.dg/expr/dtor3.C b/gcc/testsuite/g++.dg/expr/dtor3.C new file mode 100644 index 000000000..036e9f2a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor3.C @@ -0,0 +1,10 @@ +struct B { + ~B(); +}; +struct D : public B { + ~D(); +}; + +void f(D d) { + d.B::~B(); +} diff --git a/gcc/testsuite/g++.dg/expr/dtor4.C b/gcc/testsuite/g++.dg/expr/dtor4.C new file mode 100644 index 000000000..7aed80a69 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor4.C @@ -0,0 +1,10 @@ +typedef int C; +typedef double D; + +void +f () +{ + C o; + + o.D::~C (); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/enum1.C b/gcc/testsuite/g++.dg/expr/enum1.C new file mode 100644 index 000000000..40dc5faf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/enum1.C @@ -0,0 +1,10 @@ +// { dg-do run } + +extern "C" void abort(); +int main() +{ + enum { shelf = 4 } t = shelf; + if (!(t & shelf)) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/expr/for1.C b/gcc/testsuite/g++.dg/expr/for1.C new file mode 100644 index 000000000..baffd424a --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/for1.C @@ -0,0 +1,14 @@ +// PR c++/13663 + +struct S { + void f(); +}; + +void g(int); +void g(double); + +void h () { + S s; + for (;;s.f); // { dg-error "" } + for (;;g); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/for2.C b/gcc/testsuite/g++.dg/expr/for2.C new file mode 100644 index 000000000..52f769641 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/for2.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// PR c++/17661 +// We used to try to create a temprary for the condition +// expression in the for which was wrong. + + +struct C +{ + C (const C &x); +}; +C &f(); +void breakme (C j, bool k) +{ + for (;; k ? j : f()) ; +} diff --git a/gcc/testsuite/g++.dg/expr/incomplete1.C b/gcc/testsuite/g++.dg/expr/incomplete1.C new file mode 100644 index 000000000..03e363a3d --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/incomplete1.C @@ -0,0 +1,14 @@ +// PR 10202 +// { dg-do compile } +// { dg-options -O0 } + +extern struct _smtp_account smtp_accounts[]; +typedef struct _smtp_account { + int flags; +} Smtp_Account; + +void get_smtp_host_info () +{ + if (smtp_accounts[0].flags & 0x01) + get_smtp_host_info(); +} diff --git a/gcc/testsuite/g++.dg/expr/lval1.C b/gcc/testsuite/g++.dg/expr/lval1.C new file mode 100644 index 000000000..bed47d8e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval1.C @@ -0,0 +1,7 @@ +// Contributed by Matt Austern <austern@apple.com> + +void f () +{ + int n; + (char) n = 1; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/lval2.C b/gcc/testsuite/g++.dg/expr/lval2.C new file mode 100644 index 000000000..5d062f1c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval2.C @@ -0,0 +1,27 @@ +// PR c++/19199 + +// { dg-do run } + +// We used to turn the COND_EXPR lvalue into a MIN_EXPR rvalue, and +// then return a reference to a temporary in qMin. + +#include <assert.h> + +enum Foo { A, B }; + +template<typename T> T &qMin(T &a, T &b) +{ + return a < b ? a : b; +} + +int main (int, char **) +{ + Foo f = A; + Foo g = B; + Foo &h = qMin(f, g); + assert (&h == &f || &h == &g); + const Foo &i = qMin((const Foo&)f, (const Foo&)g); + assert (&i == &f || &i == &g); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/lval3.C b/gcc/testsuite/g++.dg/expr/lval3.C new file mode 100644 index 000000000..f106e6961 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval3.C @@ -0,0 +1,9 @@ +// i++ is never an lvalue +void +f() +{ + bool i = 0; + i++ = 3; // { dg-error "" } +} + + diff --git a/gcc/testsuite/g++.dg/expr/lval4.C b/gcc/testsuite/g++.dg/expr/lval4.C new file mode 100644 index 000000000..c66e2f6af --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval4.C @@ -0,0 +1,9 @@ +// ++i is always an lvalue +void +f() +{ + bool i = 0; + ++i = 3; +} + + diff --git a/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C b/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C new file mode 100644 index 000000000..9fe65bc97 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C @@ -0,0 +1,12 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: jmr@fulcrummicro.com +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + + +struct A; + +int main() +{ + A::g(); // { dg-error "incomplete" "" } +} + diff --git a/gcc/testsuite/g++.dg/expr/minmax.C b/gcc/testsuite/g++.dg/expr/minmax.C new file mode 100644 index 000000000..407a92bb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/minmax.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +void f(void) +{ + int a, b; + (a >? b) = 1; // { dg-error "" } +} + + +void g(void) +{ + int a, b; + (a <? b) = 1; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/overflow1.C b/gcc/testsuite/g++.dg/expr/overflow1.C new file mode 100644 index 000000000..b67b4e42e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/overflow1.C @@ -0,0 +1,8 @@ +#include <limits.h> + +enum E { + A = (unsigned char)-1, /* OK */ + B = (signed char)UCHAR_MAX, /* implementation-defined */ + C = INT_MAX+1, /* undefined (C)/ill-formed (C++) { dg-message "" } */ + D = UINT_MAX+1 /* OK */ +}; diff --git a/gcc/testsuite/g++.dg/expr/pmf-1.C b/gcc/testsuite/g++.dg/expr/pmf-1.C new file mode 100644 index 000000000..3dd01c6b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pmf-1.C @@ -0,0 +1,20 @@ +// C++ PR/2521 +// Copyright (C) 2002 Free Software Foundation +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + +// { dg-do compile } + +struct A +{ + void f(); + void foo(void (A::*)(int)); // { dg-message "void A::foo|no known conversion" "" } + template<typename T> + void g(T); + void h() + { + void (A::*p)() = &A::f; + void (A::*q)() = &(A::f); // { dg-error "parenthesized" "" } + foo(&g<int>); // { dg-error "no matching" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 17 } + } +}; diff --git a/gcc/testsuite/g++.dg/expr/pr19355-1.C b/gcc/testsuite/g++.dg/expr/pr19355-1.C new file mode 100644 index 000000000..ce11b8188 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pr19355-1.C @@ -0,0 +1,11 @@ +// PR c++/19355 +// { dg-do compile } + +typedef bool Boolean; +extern Boolean is_nil (); +void f(void) +{ + unsigned int ilen; + if(!((ilen > 0 ? !is_nil () : 1))) {} +} + diff --git a/gcc/testsuite/g++.dg/expr/pr29066.C b/gcc/testsuite/g++.dg/expr/pr29066.C new file mode 100644 index 000000000..8bf6bb0a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pr29066.C @@ -0,0 +1,42 @@ +// PR c++/29066 +// Test pointer to member function comparison +// { dg-do run } + +extern "C" void abort (void); + +struct X +{ + virtual void a(void)=0; +}; + +struct Z : public X +{ + void a(void) {} +}; + + +void f(X *obj) +{ + void (X::*xp)(void) = 0; + void (X::*xp2)(void) = 0; + + xp = &X::a; + + if (xp == xp2) + { + abort(); + } + + if (xp == 0) + { + abort(); + } +} + +int main(int argc, char* argv[]) +{ + Z myobj; + + f(&myobj); + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem1.C b/gcc/testsuite/g++.dg/expr/ptrmem1.C new file mode 100644 index 000000000..146143a1e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem1.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Aug 2003 <nathan@codesourcery.com> + +// PR 11766. ICE + +template<typename T> +struct normal_iterator +{ + normal_iterator(const T& __i); +}; + + +template<typename _Tp> +struct vector +{ + void end() const { normal_iterator<const _Tp*> (this->pt); } + void size() const { end(); } + _Tp* pt; +}; + + + +struct MuonTag { + typedef void (MuonTag::*Selector)(); +}; + +void foo() +{ + vector<MuonTag::Selector> _selectors; + _selectors.size(); +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem4.C b/gcc/testsuite/g++.dg/expr/ptrmem4.C new file mode 100644 index 000000000..0803c9e63 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem4.C @@ -0,0 +1,16 @@ +// PR c++/15471 +// { dg-do run } + +struct myclass { + unsigned a; + union { + unsigned x; + }; +}; + +int main () { + myclass foo; + unsigned myclass::* member = &myclass::x; + if (&(foo.*member) != &foo.x) + return 1; +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem5.C b/gcc/testsuite/g++.dg/expr/ptrmem5.C new file mode 100644 index 000000000..e36983d02 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem5.C @@ -0,0 +1,7 @@ +// PR c++/15696 + +struct A {}; + +typedef void (A::*ftype)(); + +void foo() { A().*ftype(); } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/expr/ptrmem6.C b/gcc/testsuite/g++.dg/expr/ptrmem6.C new file mode 100644 index 000000000..0c75385fb --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem6.C @@ -0,0 +1,12 @@ +// PR C++/21614 +// { dg-additional-sources "ptrmem6a.C" } +// { dg-do run } + +extern struct Z *p; +extern int (Z::*m) (); + +int main () { + if ((p->*m)() == 7) + return 0; + return 1; +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem6a.C b/gcc/testsuite/g++.dg/expr/ptrmem6a.C new file mode 100644 index 000000000..8dad81c58 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem6a.C @@ -0,0 +1,9 @@ +struct Z { + int f(); +}; + +int Z::f() { return 7; } + +struct Z z; +int (Z::*m)() = &Z::f; +struct Z*p = &z; diff --git a/gcc/testsuite/g++.dg/expr/ptrmem7.C b/gcc/testsuite/g++.dg/expr/ptrmem7.C new file mode 100644 index 000000000..a94990e54 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem7.C @@ -0,0 +1,21 @@ +// PR c++/22545 + +struct A { + int member; + A() : member(13) {} +}; + +A a; + +struct B { + operator A*() { return &a; } +}; + +B b; + +int A::* member_pntr = &A::member; + +int main() +{ + return b ->* member_pntr; +} diff --git a/gcc/testsuite/g++.dg/expr/return1.C b/gcc/testsuite/g++.dg/expr/return1.C new file mode 100644 index 000000000..7a64988e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/return1.C @@ -0,0 +1,9 @@ +// PR c++/18545 + +struct A; + +A foo() // { dg-error "" } +{ + A a; // { dg-error "" } + return a; +} diff --git a/gcc/testsuite/g++.dg/expr/sizeof1.C b/gcc/testsuite/g++.dg/expr/sizeof1.C new file mode 100644 index 000000000..fa84481fa --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/sizeof1.C @@ -0,0 +1,7 @@ +// PR c++/12989 + +struct A +{ + int foo() { return sizeof(bar); } // { dg-error "" } + int bar(); +}; diff --git a/gcc/testsuite/g++.dg/expr/sizeof2.C b/gcc/testsuite/g++.dg/expr/sizeof2.C new file mode 100644 index 000000000..ca14ff79f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/sizeof2.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// Contributed by Wolfgang Bangerth <bangerth at ticam dot utexas dot edu> +// PR c++/9259: Allow non-qualified member calls in sizeof expressions. + +template <bool> struct StaticAssert; +template <> struct StaticAssert<true> {}; + +struct S +{ + static int check (); + static double check2 (); + static const int value = sizeof(check()); + static const int value2 = sizeof(check2()); +}; + +template <class> +struct T +{ + static int check (); + static double check2 (); + static const int value = sizeof(check()); + static const int value2 = sizeof(check2()); +}; + +StaticAssert<(S::value == sizeof(int))> s; +StaticAssert<(S::value2 == sizeof(double))> s2; + +StaticAssert<(T<void>::value == sizeof(int))> t; +StaticAssert<(T<void>::value2 == sizeof(double))> t2; + diff --git a/gcc/testsuite/g++.dg/expr/sizeof3.C b/gcc/testsuite/g++.dg/expr/sizeof3.C new file mode 100644 index 000000000..31338b0b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/sizeof3.C @@ -0,0 +1,4 @@ +// PR c++/15337 + +class CCC; +int main() { sizeof(CCC); return 0; } // { dg-error ".*CCC.*" } diff --git a/gcc/testsuite/g++.dg/expr/static_cast1.C b/gcc/testsuite/g++.dg/expr/static_cast1.C new file mode 100644 index 000000000..f1d88bff3 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast1.C @@ -0,0 +1,5 @@ +void foo(int x) +{ + static_cast<const unsigned int&>(x); +} + diff --git a/gcc/testsuite/g++.dg/expr/static_cast2.C b/gcc/testsuite/g++.dg/expr/static_cast2.C new file mode 100644 index 000000000..7b5d46ded --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast2.C @@ -0,0 +1,7 @@ +struct B {}; + +int main () { + B a; + (1 ? static_cast<B&>(a) : + *static_cast<B*>(&a)); +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast3.C b/gcc/testsuite/g++.dg/expr/static_cast3.C new file mode 100644 index 000000000..744648c3f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast3.C @@ -0,0 +1,24 @@ +template <class T> struct static_abort {}; + +template <class E> +struct any +{ + const E& self() const { return static_cast<const E&>(*this); } +}; + +struct range : public any<range> +{ + range() {} + + template <class U> + range(const U&) + { + typedef typename static_abort<U>::ret t; + } +}; + +int main() +{ + const any<range>& r = *new range(); + r.self(); +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast4.C b/gcc/testsuite/g++.dg/expr/static_cast4.C new file mode 100644 index 000000000..cea7f4873 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast4.C @@ -0,0 +1,11 @@ +class C { +public: + explicit C(int) {} +}; + +int main() +{ + int i = 0; + static_cast<C>(i); + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast5.C b/gcc/testsuite/g++.dg/expr/static_cast5.C new file mode 100644 index 000000000..1a51f1516 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast5.C @@ -0,0 +1,17 @@ +void ambig() +{ + struct A {}; + struct B : A {}; + struct C : A {}; + struct D : B, C {}; + + D d; + A* ap = static_cast<B*> (&d); + D* db = static_cast<D*> (ap); // { dg-error "" } + + D& dr1 = static_cast<D&> (*ap); // { dg-error "" } + + A& ar = static_cast<C&> (d); + D& dr = static_cast<D&> (ar); // { dg-error "" } +} + diff --git a/gcc/testsuite/g++.dg/expr/static_cast6.C b/gcc/testsuite/g++.dg/expr/static_cast6.C new file mode 100644 index 000000000..90f32f1d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast6.C @@ -0,0 +1,15 @@ +// PR c++/21853 + +struct blah { + int a; +}; + +int main( int argc, char ** argv ) { + int blah::* ptdma = &blah::a; + + const void *ptdmv = static_cast< void * >( &ptdma ); + + int blah::* const ptdmb = * static_cast< int blah::* const * >( ptdmv ); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast7.C b/gcc/testsuite/g++.dg/expr/static_cast7.C new file mode 100644 index 000000000..bced805bc --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast7.C @@ -0,0 +1,10 @@ +// Regression test for bug 39415 (and its duplicate 44916). +struct S {}; +struct T : S {}; +int f(const T*) {} +void f(T*); +int main() { + S* s(0); + int a = f(static_cast<const T*>(s)); + int b = f(static_cast<const T*>(0)); +} diff --git a/gcc/testsuite/g++.dg/expr/stdarg1.C b/gcc/testsuite/g++.dg/expr/stdarg1.C new file mode 100644 index 000000000..85b6f7460 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/stdarg1.C @@ -0,0 +1,13 @@ +// PR c++/23840 + +#include <stdarg.h> +struct S +{ + int f(int); +}; +void f(int i, ...) +{ + va_list ap; + va_start (ap, i); + va_arg (ap, S).f(0); +} diff --git a/gcc/testsuite/g++.dg/expr/stdarg2.C b/gcc/testsuite/g++.dg/expr/stdarg2.C new file mode 100644 index 000000000..cf2eabcb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/stdarg2.C @@ -0,0 +1,30 @@ +// PR target/26141 + +#include <stdarg.h> + +struct S +{ + double a; +}; + +void +foo (int z, ...) +{ + struct S arg; + va_list ap; + arg = va_arg (ap, struct S); +} + + +struct T +{ + __complex__ float a; +}; + +void +bar (int z, ...) +{ + struct T arg; + va_list ap; + arg = va_arg (ap, struct T); +} diff --git a/gcc/testsuite/g++.dg/expr/stmt-expr-1.C b/gcc/testsuite/g++.dg/expr/stmt-expr-1.C new file mode 100644 index 000000000..c4db5157f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/stmt-expr-1.C @@ -0,0 +1,36 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/40866 +// { dg-options "-std=gnu++98" } +// { dg-do compile } + +template <typename T> class QForeachContainer { +public: + QForeachContainer(); + int brk; + typename T::const_iterator i; +}; + +template <typename T> class QList { +public: + class const_iterator { + public: + const_iterator(const const_iterator &o); + const_iterator &operator++(); + }; +}; + +class QAction; +class QWidget { +public: + QList<QAction*> actions() const; +}; +class myDialog : public QWidget { + myDialog(); +}; + +myDialog::myDialog() +{ + QForeachContainer<__typeof__(actions())> _container_; + ({++_container_.brk; ++_container_.i;}); +} + diff --git a/gcc/testsuite/g++.dg/expr/string-1.C b/gcc/testsuite/g++.dg/expr/string-1.C new file mode 100644 index 000000000..9a0a5ff7b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/string-1.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// This testcase used to seg fault (PR c++/38648) + +// { dg-prune-output "initializer lists" } + +char a[1]; + +int foo( +{ + a = ""; // { dg-error "" } + return 0; // { dg-error "" } +} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/expr/string-2.C b/gcc/testsuite/g++.dg/expr/string-2.C new file mode 100644 index 000000000..252fa7036 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/string-2.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// This testcase used to seg fault (PR c++/38648) + +char a[1]; + +int foo(a = "") // { dg-error "invalid array assignment" } +{ // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/unary1.C b/gcc/testsuite/g++.dg/expr/unary1.C new file mode 100644 index 000000000..4ea230f01 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/unary1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Unary plus (but not unary minus) can be applied to pointer types + +void *p; + +void f(void) +{ + -p; // { dg-error "wrong type argument" } + +p; +} + +template <int> +void g(void) +{ + -p; // { dg-error "wrong type argument" } + +p; +} diff --git a/gcc/testsuite/g++.dg/expr/unary2.C b/gcc/testsuite/g++.dg/expr/unary2.C new file mode 100644 index 000000000..841881591 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/unary2.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Unary plus/minus are not lvalues. + +// In templates we require an instantiation to emit the diagnostic. This +// is wrong and it is PR 18474. + +int n; + +void f(void) +{ + -n = 0; // { dg-error "lvalue" } + +n = 0; // { dg-error "lvalue" } +} + +template <int> +void g(void) +{ + -n = 0; // { dg-error "lvalue" "" { xfail *-*-* } } + +n = 0; // { dg-error "lvalue" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/expr/unary3.C b/gcc/testsuite/g++.dg/expr/unary3.C new file mode 100644 index 000000000..abca0322d --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/unary3.C @@ -0,0 +1,11 @@ +// PR c++/41131 +// { dg-do compile } + +struct X { enum E { a = 100 }; }; + +int +main () +{ + X x; + (void) &x.a; // { dg-error "lvalue required" } +} diff --git a/gcc/testsuite/g++.dg/expr/volatile1.C b/gcc/testsuite/g++.dg/expr/volatile1.C new file mode 100644 index 000000000..712c9e0fb --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/volatile1.C @@ -0,0 +1,9 @@ +// PR c++/23167 + +struct dom +{ + static int tostr(); + void eval_old() volatile{tostr();} + ~dom() throw(); +}; + |