diff options
author | Jing Yu <jingyu@google.com> | 2012-02-15 15:40:16 -0800 |
---|---|---|
committer | Jing Yu <jingyu@google.com> | 2012-02-15 15:40:16 -0800 |
commit | 3f73d6ef90458b45bbbb33ef4c2b174d4662a22d (patch) | |
tree | 1b5f0d96c51b51168b3713058a1b62e92f1136eb /gcc-4.6/gcc/testsuite/g++.dg | |
parent | d7030123e04baab5dbff9c9ee04c0de99bd9a774 (diff) | |
download | toolchain_gcc-3f73d6ef90458b45bbbb33ef4c2b174d4662a22d.tar.gz toolchain_gcc-3f73d6ef90458b45bbbb33ef4c2b174d4662a22d.tar.bz2 toolchain_gcc-3f73d6ef90458b45bbbb33ef4c2b174d4662a22d.zip |
Sync down FSF r184235@google/gcc-4_6_2-mobile branch
1) Get mostly new patches from FSF gcc-4.6 branch
2) Fix PR52129
3) Insert GNU-stack note for all ARM targets
Change-Id: I2b9926981210e517e4021242908074319a91d6bd
Diffstat (limited to 'gcc-4.6/gcc/testsuite/g++.dg')
95 files changed, 1959 insertions, 40 deletions
diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/auto31.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/auto31.C new file mode 100644 index 000000000..2c74b72df --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/auto31.C @@ -0,0 +1,12 @@ +// PR c++/51416 +// { dg-options "-std=c++0x" } + +template<typename T, typename... U> void foo(T, U... u) +{ + auto foo(u...); // { dg-error "auto" } +} + +void bar() +{ + foo(0); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C index fc69cfef6..5124f7c7f 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C @@ -22,3 +22,29 @@ struct R { }; constexpr R r; // { dg-bogus "" "" { xfail *-*-* } } + +// Ill-formed (no diagnostic required) +struct T { + int i; + constexpr int f() { return i; } + constexpr T(): i(0) { } + constexpr T(const T& t) : i(f()) { } // { dg-message "" } +}; + +constexpr T t1; +// Ill-formed (diagnostic required) +constexpr T t2(t1); // { dg-error "" } + +// Well-formed +struct U { + int i, j; + constexpr int f(int _i) { return _i; } + constexpr int g() { return i; } + constexpr U(): i(0), j(0) { } + constexpr U(const U& t) : i(f(t.i)),j(0) { } // { dg-bogus "" "" { xfail *-*-* } } + constexpr U(int _i) : i(_i),j(g()) { } // { dg-bogus "" "" { xfail *-*-* } } +}; + +constexpr U u1; +constexpr U u2(u1); // { dg-bogus "" "" { xfail *-*-* } } +constexpr U u3(1); // { dg-bogus "" "" { xfail *-*-* } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C index 4ae3944c3..1a0189b56 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C @@ -1,4 +1,4 @@ // { dg-options "-std=c++98" } -constexpr int i = 42; // { dg-message "std=c\\+\\+0x" } +constexpr int i = 42; // { dg-message "std=c\\+\\+11" } // { dg-error "constexpr" "" { target *-*-* } 3 } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C new file mode 100644 index 000000000..9aeb75d6b --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C @@ -0,0 +1,14 @@ +// PR c++/49924 +// { dg-options -std=c++0x } + +struct A { constexpr A() { } }; + +struct B { + A array[1]; //non-static member array of a literal type w constexpr ctor + constexpr B() : array{} { } // here is the problem +}; + +int main() +{ + constexpr B b{}; // won't compile +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C new file mode 100644 index 000000000..97f039998 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C @@ -0,0 +1,15 @@ +// PR c++/50024 +// { dg-options -std=c++0x } + +template< class T > +struct Container +{ + Container(){ + int* ptr = new int{}; + } +}; + +int main() { + Container< int > c; +} + diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C new file mode 100644 index 000000000..581be6d15 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C @@ -0,0 +1,23 @@ +// PR c++/49988 +// { dg-options -std=c++0x } +// { dg-do run } + +template<int ... I> struct X { }; + +struct A { + char data[3]; + template<int ... I> + constexpr + A(const char (&s)[3], X<I...> x) : data{ s[I]...} { } +}; +struct B { + A a; + B(const char (&s)[3]) : a{s,X<0,1,2>{}} { } +}; + +int main() +{ + B b{"12"}; + if (b.a.data[0] != '1') + return 1; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C index 3af85095f..4ff398bf1 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C @@ -7,7 +7,7 @@ // p 1 constexpr specifier // objects, static const data -struct A1 { }; // { dg-message "no user-provided default constructor" } +struct A1 { int i; }; // { dg-message "no user-provided default constructor" } constexpr int i1 = 1024; constexpr A1 a1 = A1(); diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C new file mode 100644 index 000000000..35c3f25c5 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-static8.C @@ -0,0 +1,7 @@ +// PR c++/50258 +// { dg-options "-std=c++0x -pedantic" } + +struct Foo { + static const double d = 3.14; // { dg-warning "constexpr" } +}; +const double Foo::d; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C new file mode 100644 index 000000000..28d34a1d7 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-static8_nonpedantic.C @@ -0,0 +1,7 @@ +// PR c++/50258 +// { dg-options "-std=c++0x" } + +struct Foo { + static const double d = 3.14; // no warning +}; +const double Foo::d; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C new file mode 100644 index 000000000..2719e3aea --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C @@ -0,0 +1,11 @@ +// PR c++/50508 +// { dg-options -std=c++0x } + +template <class T> + struct integral_constant { + typedef T value_type; + constexpr operator value_type() { return true; } + }; + +static constexpr bool value = integral_constant<bool>() + && true; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C new file mode 100644 index 000000000..38d89936e --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C @@ -0,0 +1,10 @@ +// PR c++/50234 +// { dg-options -std=c++0x } + +#define SA(X) static_assert((X),#X) + +struct A { int i; }; + +constexpr int f(A a) { return a.i; } + +SA(f({}) == 0); diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype31.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype31.C new file mode 100644 index 000000000..b9817eb9e --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype31.C @@ -0,0 +1,13 @@ +// PR c++/49921 +// { dg-options -std=c++0x } + +struct Local +{ + void f(); +}; + +Local *l; +void (Local::*ptr)(); +decltype((l->*ptr)) i; // { dg-error "member function" } + +// { dg-prune-output "invalid type in declaration" } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype35.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype35.C new file mode 100644 index 000000000..d1fd47638 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype35.C @@ -0,0 +1,15 @@ +// PR c++/50870 +// { dg-options -std=c++0x } + +template <class V> + struct impl + { + template <class T> static T create(); + }; + +template <class T, class U, class V, class + = decltype(impl<V>::template create<T>() + -> impl<V>::template create<U>())> +struct tester { }; + +tester<impl<float>*, int, float> ti; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype36.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype36.C new file mode 100644 index 000000000..f3dfed992 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/decltype36.C @@ -0,0 +1,21 @@ +// PR c++/51265 +// { dg-options -std=c++0x } + +struct Funny +{ + int print(int); +}; + +template<typename X> +void c(); + +template<typename X, X ff> +void xx() +{ + c<decltype(ff)>(); +} + +int main() +{ + xx<int(Funny::*)(int), &Funny::print>(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted2.C index 1f400f4fa..e3aac8f1a 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted2.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted2.C @@ -17,7 +17,8 @@ void g() = delete; // { dg-error "redefinition" } struct B // { dg-message "user-provided default constructor" } { - B() = default; // { dg-message "not user-provided" } + int i; + B() = default; // { dg-message "not user-provided" } }; const B b; // { dg-error "uninitialized const" } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted32.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted32.C new file mode 100644 index 000000000..351cdae11 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/defaulted32.C @@ -0,0 +1,21 @@ +// PR c++/50531 +// { dg-options -std=c++0x } + +template <typename T> +class DataFilter +{ + public: + inline virtual ~DataFilter(); +}; + +template<typename T> +inline DataFilter<T>::~DataFilter() = default; + +class ARCalculator : public DataFilter<ARCalculator> +{ + public: + virtual void dataStart(int, int); +}; + +void ARCalculator::dataStart(int, int) +{} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C new file mode 100644 index 000000000..4bf608229 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C @@ -0,0 +1,6 @@ +// PR c++/49216 +// { dg-options -std=c++0x } + +int main() { + new int[1]{}; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist17.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist17.C index 86371e819..6ea08d150 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist17.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist17.C @@ -1,4 +1,4 @@ -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } void f(int i); diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist36.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist36.C index 94624c977..a703b4590 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist36.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist36.C @@ -1,5 +1,5 @@ // PR c++/44358 -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } #include <initializer_list> diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist5.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist5.C index 32caac382..dbd17ecbb 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist5.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist5.C @@ -1,5 +1,5 @@ // Test for narrowing diagnostics -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } #include <initializer_list> diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist57.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist57.C new file mode 100644 index 000000000..d945a4689 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist57.C @@ -0,0 +1,8 @@ +// PR c++/50054 +// { dg-options -std=c++0x } + +void g( const int& (a)[1] ) {} // { dg-error "array of references" } + +int main () { + g( { 1, 2 } ); // { dg-error "initializer list" } +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist7.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist7.C index 7913ed7ed..55a037186 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist7.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/initlist7.C @@ -1,5 +1,5 @@ // PR c++/37932 -// { dg-options "-std=c++0x" } +// { dg-options "-std=c++0x -pedantic-errors" } typedef enum { AA=1, BB=2 } my_enum; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C new file mode 100644 index 000000000..240143cf6 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C @@ -0,0 +1,9 @@ +// PR c++/50220 +// { dg-options -std=c++0x } + +template<typename Foo> struct Foobar {}; + +void foobar(const Foobar<void>& obj) +{ + [obj](){}(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C new file mode 100644 index 000000000..f47c5ba27 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C @@ -0,0 +1,7 @@ +// PR c++/43886 +// { dg-options -std=c++0x } + +void f2() { + int i = 1; + void g5(int = ([]{ return sizeof i; })()); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C index 1490a2508..0c94b554f 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C @@ -1,5 +1,6 @@ // PR c++/47263 -// { dg-options -std=c++0x } +// PR c++/49260 +// { dg-options "-std=c++0x -fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm" } // { dg-do run } #include <exception> diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C new file mode 100644 index 000000000..ef041c2bb --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C @@ -0,0 +1,17 @@ +// PR c++/50089 +// { dg-options -std=c++0x } + +struct TestBase +{ + void foo() {} +}; + +struct Test : TestBase +{ + void foo() + { + [this]{ + /*this->*/TestBase::foo(); // ICE without this-> + }(); + } +}; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C new file mode 100644 index 000000000..695a0b432 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C @@ -0,0 +1,11 @@ +// PR c++/50224 +// { dg-options "-std=c++0x -Wunused-parameter" } + +struct T; + +void m(T& t) // ERROR here +{ + [&]{ + t; // ``t`` is referenced here + }; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/noexcept11.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/noexcept11.C new file mode 100644 index 000000000..eba2c4080 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/noexcept11.C @@ -0,0 +1,4 @@ +// PR c++/50309 +// { dg-options -std=c++0x } + +void foo () noexcept () { } // { dg-error "expected" } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C index 5af4ff217..4425aacf6 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C @@ -4,6 +4,7 @@ struct A // { dg-message "user-provided default constructor" } { + int i; A() = default; // { dg-message "not user-provided" } }; @@ -14,17 +15,20 @@ struct Base struct Derived : Base // { dg-message "user-provided default constructor" } { + int i; Derived() = default; // { dg-message "not user-provided" } }; struct Derived2 : Base // { dg-message "user-provided default constructor" } { + int i; Derived2() = default; // { dg-message "not user-provided" } Derived2( Derived2 const& ) = default; }; struct Derived3 : Base // { dg-message "user-provided default constructor" } { + int i; Derived3( Derived3 const& ) = default; Derived3() = default; // { dg-message "not user-provided" } }; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr50491.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr50491.C new file mode 100644 index 000000000..48e7a1f74 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr50491.C @@ -0,0 +1,17 @@ +// { dg-options "-std=c++0x" } + +struct GrandParent { + void *get(); +}; + +template<class OBJ> +struct Parent : public GrandParent{ +}; + +template<typename T> +struct Child : public Parent<T> { + using GrandParent::get; + void Foo() { + void* ex = get(); + } +}; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr50901.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr50901.C new file mode 100644 index 000000000..439c15cc1 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr50901.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +template<class T> int foo(int a) +{ + const unsigned b = a < 0 ? -a : a; + return 0; +} + +int i = foo<float>(1); diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr51150.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr51150.C new file mode 100644 index 000000000..37eb166b4 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/pr51150.C @@ -0,0 +1,20 @@ +// PR c++/51150 +// { dg-options "-std=c++0x" } + +struct Clock { + double Now(); +}; +template <class T> void Foo(Clock* clock) { + const int now = clock->Now(); +} + +template void Foo<float>(Clock*); + +template <class T> void Boo(int val) { + const int now1 = (double)(val); + const int now2 = const_cast<double>(val); // { dg-error "invalid" } + const int now3 = static_cast<double>(val); + const int now4 = reinterpret_cast<double>(val); // { dg-error "invalid" } +} + +template void Boo<float>(int); diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C new file mode 100644 index 000000000..e7d5b6d34 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C @@ -0,0 +1,18 @@ +// PR c++/51406 +// { dg-do run } +// { dg-options "-std=c++0x" } + +extern "C" int printf(const char *,...); +extern "C" void abort(); + +struct A { int a; A() : a(1) {} }; +struct B { int b; B() : b(2) {} }; +struct X : A, B {}; + +int main() { + X x; + int a=static_cast<A&&>(x).a; + int b=static_cast<B&&>(x).b; + // printf ("%d %d\n", a, b); + if (a!=1 || b!=2) abort(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C new file mode 100644 index 000000000..8f4a56bf9 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C @@ -0,0 +1,13 @@ +// PR c++/51161 +// { dg-options "-std=c++0x" } + +struct A{}; +struct B : A{}; +struct C : A{}; +struct D : B, C{}; + +int main() +{ + D d; + static_cast<A &&>(d); // { dg-error "ambiguous" } +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/sfinae27.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/sfinae27.C new file mode 100644 index 000000000..93327ba9c --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/sfinae27.C @@ -0,0 +1,20 @@ +// PR c++/50157 +// { dg-options -std=c++0x } + +template<class T> +T val(); + +template<class T, class Arg, class = + decltype(::new T(val<Arg>())) +> +auto test(int) -> char; + +template<class, class> +auto test(...) -> char (&)[2]; + +struct P { + explicit operator bool(); // (#13) +}; + +typedef decltype(test<bool, P>(0)) type; // OK +typedef decltype(test<float, P>(0)) type2; // Error (#17) diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/union5.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/union5.C new file mode 100644 index 000000000..423b34823 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/union5.C @@ -0,0 +1,23 @@ +// PR c++/49803 +// { dg-options -std=c++0x } + +struct X +{ + X() = delete; +}; + +union Y +{ + // N3291=11-0061 12.6.2/8 says no initialization of + // of other variant members (i.e. m_x) should + // be performed. + Y() : m_char1{ } + { } + + struct + { + char m_char1; + }; + + X m_x; +}; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C new file mode 100644 index 000000000..a8463de19 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C @@ -0,0 +1,12 @@ +// PR c++/50086 +// { dg-options -std=c++0x } + +template<typename T> void tfun(); +template<typename T> void fun1(T); +template<typename... Types> void fun2(Types... args); + +int main() +{ + fun1(tfun<int>); // ok + fun2(tfun<int>); // error: unresolved overloaded function type +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic103.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic103.C index 6d12331d0..9d6b5ea20 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic103.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic103.C @@ -5,7 +5,7 @@ T&& create(); template<class T, class... Args> void test() { - T t(create<Args>()...); // { dg-error "unknown bound" } + T t(create<Args>()...); // { dg-error "incomplete" } (void) t; } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic114.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic114.C new file mode 100644 index 000000000..3ffede5c5 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic114.C @@ -0,0 +1,27 @@ +// PR c++/49785 +// { dg-options -std=c++0x } + +template <typename, typename ...> struct B { }; +template <typename> class A; + +template <typename R, typename ... S> +struct A <R (S ...)> : public B <R, S ...> +{ + struct C {}; + template <typename D> A (D, C = C ()) { } + R operator () (...); +}; + +template <typename R, typename ... S, typename T> +auto operator >> (A <R (S ...)>, T)->A <R (S ...)> +{ + []() {}; +} + +int +main () +{ + A <int (int, int)> a = [](int, int) {}; + auto b = []{}; + (a >> b) (3, 5); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic115.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic115.C new file mode 100644 index 000000000..fa032e3b0 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic115.C @@ -0,0 +1,19 @@ +// PR c++/49593 +// { dg-options -std=c++0x } + +template<typename... T> void f(T...) { } + +template<typename... Args> +static void +g(Args&&... args) +{ + f( static_cast<Args>(args)... ); + f( (Args)args... ); + f( Args(args)... ); + f( Args{args}... ); +} + +int main() +{ + g(1, '2', 3.0); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic116.C b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic116.C new file mode 100644 index 000000000..079d751cb --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/cpp0x/variadic116.C @@ -0,0 +1,32 @@ +// Origin: PR c++/48320 +// { dg-options -std=c++0x } + +template<class... T> +struct tuple +{ + typedef int type; +}; + +template<int... Indices> +struct indices +{ +}; + +template<unsigned i, class Tuple> +struct tuple_element +{ + typedef Tuple type; +}; + +template<class Tuple, + int... Indices, + class Result = tuple<typename tuple_element<Indices, Tuple>::type...> > +Result +f(Tuple&&, indices<Indices...>); + + +void +foo() +{ + f(tuple<int, char, unsigned> (), indices<2, 1, 0> ()); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/debug/dwarf2/icf.C b/gcc-4.6/gcc/testsuite/g++.dg/debug/dwarf2/icf.C index af2c112b6..523ee8700 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/debug/dwarf2/icf.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/debug/dwarf2/icf.C @@ -40,11 +40,11 @@ test2(A* a) // Verify that we get .debug_dcall and .debug_vcall tables generated // and that we see entries for both virtual calls. -// { dg-final { scan-assembler "\\.section.*\.debug_dcall" } } +// { dg-final { scan-assembler "\\.section.*\.debug_dcall" { xfail mips-sgi-irix* } } } // { dg-final { scan-assembler "\\.section.*\.debug_vcall" } } -// { dg-final { scan-assembler "New caller" } } -// { dg-final { scan-assembler "Caller DIE offset" } } +// { dg-final { scan-assembler "New caller" { xfail mips-sgi-irix* } } } +// { dg-final { scan-assembler "Caller DIE offset" { xfail mips-sgi-irix* } } } // { dg-final { scan-assembler "Point of call" } } -// { dg-final { scan-assembler "Callee DIE offset" } } +// { dg-final { scan-assembler "Callee DIE offset" { xfail mips-sgi-irix* } } } // { dg-final { scan-assembler "0\[ \t\]+.*Vtable slot" } } // { dg-final { scan-assembler "0x1\[ \t\]+.*Vtable slot" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/44473-1.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/44473-1.C new file mode 100644 index 000000000..38689fa16 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/44473-1.C @@ -0,0 +1,122 @@ +/* { dg-do assemble } */ + +/* Minimized from the testcase in PR c++/44473; mangling of decimal types + did not include CV qualifiers. */ + +namespace std +{ + namespace decimal + { + class decimal32 + { + public: + typedef float __decfloat32 __attribute__ ((mode (SD))); + explicit decimal32 (float __r):__val (__r) {} + private: + __decfloat32 __val; + }; + }; + + template <typename _BI1, typename _BI2> + _BI2 copy_backward (_BI1 __first, _BI2 __result); +} + +namespace __gnu_cxx +{ + template <typename _Iterator, typename _Container> + class __normal_iterator + { + public: + explicit __normal_iterator (const _Iterator & __i) {} + const _Iterator & base () const {} + }; + + template <typename _IteratorL, typename _IteratorR, typename _Container> + bool operator== (const __normal_iterator <_IteratorL, _Container> &__lhs, + const __normal_iterator <_IteratorR, _Container> &__rhs) + { + return __lhs.base () == __rhs.base (); + } + + template <typename _Tp> + class new_allocator + { + public: + typedef _Tp *pointer; + typedef const _Tp *const_pointer; + template <typename _Tp1> + struct rebind + { + typedef new_allocator <_Tp1> other; + }; + }; +} + +namespace std +{ + template <typename _Tp> + class allocator:public __gnu_cxx::new_allocator <_Tp> {}; + + template <typename _Tp, typename _Alloc> + struct _Vector_base + { + typedef typename _Alloc::template rebind <_Tp>::other _Tp_alloc_type; + struct _Vector_impl:public _Tp_alloc_type + { + typename _Tp_alloc_type::pointer _M_finish; + }; + public: _Vector_impl _M_impl; + }; + + template <typename _Tp, typename _Alloc = std::allocator <_Tp> > + class vector:protected _Vector_base <_Tp, _Alloc> + { + typedef _Vector_base <_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public: + typedef _Tp value_type; + typedef typename _Tp_alloc_type::pointer pointer; + typedef typename _Tp_alloc_type::const_pointer const_pointer; + typedef __gnu_cxx::__normal_iterator <pointer, vector> iterator; + typedef __gnu_cxx::__normal_iterator <const_pointer, vector> + const_iterator; + const_iterator begin () const; + iterator end () + { + return iterator (this->_M_impl._M_finish); + } + const_iterator end () const + { + return const_iterator (this->_M_impl._M_finish); + } + bool empty () const + { + return begin () == end (); + } + void push_back (const value_type & __x) + { + _M_insert_aux (end ()); + } + void _M_insert_aux (iterator __position); + }; + + template <typename _Tp, typename _Alloc> + void vector <_Tp, _Alloc>::_M_insert_aux (iterator __position) + { + std::copy_backward (__position.base (), this->_M_impl._M_finish - 1); + } +} + +std::vector <std::decimal::decimal32> vec; + +int +foo () +{ + return (vec.empty ()) ? 1 : 0; +} + +bool +bar () +{ + vec.push_back (std::decimal::decimal32 (0)); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/44473-2.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/44473-2.C new file mode 100644 index 000000000..311f62299 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/44473-2.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +int bar (const std::decimal::decimal64 & x) { } + +int foo () +{ + std::decimal::decimal64 x(0); + bar (x); +} + +// { dg-final { scan-assembler "_Z3barRKDd:" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/base.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/base.C new file mode 100644 index 000000000..3e5dc50ba --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/base.C @@ -0,0 +1,23 @@ +// PR c++/50207 +// { dg-do compile } + +namespace std +{ + namespace decimal + { + template <class _Fmt> struct _FmtTraits; + class decimal32; + template <> struct _FmtTraits <decimal32> + { + static const long _NumBytes = 4UL; + }; + template <class _Tr> class _DecBase + { + unsigned char _Bytes[_Tr::_NumBytes]; + }; + class decimal32 : public _DecBase <_FmtTraits <decimal32> > // { dg-error "has base" } + { + decimal32 () { } + }; + } +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-1.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-1.C new file mode 100644 index 000000000..455d3e4c0 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-1.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle13.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (float __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A { + template <typename T> std::decimal::decimal64 f (); + std::decimal::decimal64 operator+(); + operator std::decimal::decimal64 (); + template <typename T> + std::decimal::decimal64 operator-(); +}; + +typedef std::decimal::decimal64 (A::*P)(); + +template <P> struct S {}; + +template <typename T> void g (S<&T::template f<std::decimal::decimal64> >) {} +template <typename T> void g (S<&T::operator+ >) {} +template <typename T> void g (S<&T::operator std::decimal::decimal64>) {} +template <typename T> void g (S<&T::template operator- <std::decimal::decimal64> >) {} + +template void g<A> (S<&A::f<std::decimal::decimal64> >); +template void g<A> (S<&A::operator+>); +template void g<A> (S<&A::operator std::decimal::decimal64>); + +// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_1fIDdEEE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_plEE\[: \t\n\]" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-2.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-2.C new file mode 100644 index 000000000..1af9aa1a0 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-2.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle15.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (float __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A { + template <typename T> std::decimal::decimal64 f (); +}; + +typedef std::decimal::decimal64 (A::*P)(); + +template <P> struct S {}; + +void g (S<&A::f<std::decimal::decimal64> >) {} + +// { dg-final { scan-assembler "\n?_Z1g1SIXadL_ZN1A1fIDdEEDdvEEE\[: \t\n\]" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-3.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-3.C new file mode 100644 index 000000000..c716ed0e9 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-3.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle20-1.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +template <int I> void f(std::decimal::decimal64 (*)[2]) {} +template <int I> void g(std::decimal::decimal64 (*)[I+2]) {} + +static const std::decimal::decimal64 I(1); +static const std::decimal::decimal64 J(2); + +template void f<1>(std::decimal::decimal64 (*)[2]); +template void g<1>(std::decimal::decimal64 (*)[3]); + +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPA2_Dd\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_Dd\[: \t\n\]" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-4.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-4.C new file mode 100644 index 000000000..899d5661c --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-4.C @@ -0,0 +1,35 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle30.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A +{ + template <class T> + struct B + { + typedef T myT; + }; +}; + +template <class T> +void f (T t, typename T::template B<std::decimal::decimal64>::myT u, typename T::template B<int>::myT v); + +void foo () +{ + f (A(), std::decimal::decimal64(0), 1); +} + +// { dg-final { scan-assembler "_Z1fI1AEvT_NS1_1BIDdE3myTENS2_IiE3myTE" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-5.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-5.C new file mode 100644 index 000000000..794577f86 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/mangle-5.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle35.C. + +namespace std { + namespace decimal { + class decimal128 { + public: + typedef float __decfloat128 __attribute__ ((mode (TD))); + explicit decimal128 (int __r):__val (__r) {} + private: + __decfloat128 __val; + }; + } +} + +template<void (*)()> struct A {}; + +template<typename> void foo(); + +template<typename T> A<foo<T> > bar(); + +void baz() +{ + bar<std::decimal::decimal128>(); +} + +// { dg-final { scan-assembler "_Z3barIDeE1AIX3fooIT_EEEv" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/dfp/nofields.C b/gcc-4.6/gcc/testsuite/g++.dg/dfp/nofields.C new file mode 100644 index 000000000..7234672d4 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/dfp/nofields.C @@ -0,0 +1,19 @@ +// PR c++/46862 +// { dg-do compile } + +namespace std +{ + namespace decimal + { + class decimal32 { }; // { dg-error "does not have any fields" } + class decimal64 { }; // { dg-error "does not have any fields" } + class decimal128 { }; // { dg-error "does not have any fields" } + } +} + +void +foo (std::decimal::decimal32 x, + std::decimal::decimal64 y, + std::decimal::decimal128 z) +{ +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/eh/defarg1.C b/gcc-4.6/gcc/testsuite/g++.dg/eh/defarg1.C new file mode 100644 index 000000000..5c6e4df49 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/eh/defarg1.C @@ -0,0 +1,10 @@ +// PR c++/50424 +// { dg-do run } + +int f() { throw 1; } +void g( int = f() ) { } +void h() { g(); } +int main() +{ + try { h(); } catch (int) { } +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/ext/altivec-17.C b/gcc-4.6/gcc/testsuite/g++.dg/ext/altivec-17.C index 54eff8a24..099f8742e 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/ext/altivec-17.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/ext/altivec-17.C @@ -12,5 +12,5 @@ typedef vector__ bool__ int bool_simd_type; void Foo (bool_simd_type const &a) { - simd_type const &v = a; // { dg-error "'const simd_type&' from expression of type 'const bool_simd_type'" } + simd_type const &v = a; // { dg-error "invalid initialization of reference of type" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/ext/pretty3.C b/gcc-4.6/gcc/testsuite/g++.dg/ext/pretty3.C index 01b14579a..e59d77e1e 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/ext/pretty3.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/ext/pretty3.C @@ -16,4 +16,4 @@ int main () { printf ("%s\n", D<int>().foo (0)); } -// { dg-final { scan-assembler "const char\\* D<U>::foo\\(typename B<U>::X\\)" } } +// { dg-final { scan-assembler "char const\\* D<U>::foo\\(typename B<U>::X\\)" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/fstack-protector-strong.C b/gcc-4.6/gcc/testsuite/g++.dg/fstack-protector-strong.C new file mode 100644 index 000000000..a4f0f8163 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/fstack-protector-strong.C @@ -0,0 +1,35 @@ +/* Test that stack protection is done on chosen functions. */ + +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -fstack-protector-strong" } */ + +class A +{ +public: + A() {} + ~A() {} + void method(); + int state; +}; + +/* Frame address exposed to A::method via "this". */ +int +foo1 () +{ + A a; + a.method (); + return a.state; +} + +/* Possible destroying foo2's stack via &a. */ +int +global_func (A& a); + +/* Frame address exposed to global_func. */ +int foo2 () +{ + A a; + return global_func (a); +} + +/* { dg-final { scan-assembler-times "stack_chk_fail" 2 } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/gcov/gcov-2.C b/gcc-4.6/gcc/testsuite/g++.dg/gcov/gcov-2.C index 6d002f5d2..66d8af39b 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/gcov/gcov-2.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/gcov/gcov-2.C @@ -20,7 +20,7 @@ private: void foo() { - C c; /* count(2) */ + C c; /* count(1) */ c.seti (1); /* count(1) */ } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/array28.C b/gcc-4.6/gcc/testsuite/g++.dg/init/array28.C new file mode 100644 index 000000000..8cf19ba43 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/array28.C @@ -0,0 +1,7 @@ +// PR c++/49669 + +struct Foo { explicit Foo(int) { } }; +struct Goo { + Goo() : x(Foo(4), Foo(5)) { } // { dg-error "array" } + Foo x[2]; +}; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/const8.C b/gcc-4.6/gcc/testsuite/g++.dg/init/const8.C new file mode 100644 index 000000000..4eb293d65 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/const8.C @@ -0,0 +1,11 @@ +// DR 234 - it should be OK to leave off the initializer of a const +// variable if the default constructor fully initializes the object. + +struct A { }; +const A a; + +struct B { A a; }; +const B b; + +struct C { virtual void f(); }; +const C c; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/pr42844.C b/gcc-4.6/gcc/testsuite/g++.dg/init/pr42844.C index 7b423ccb6..299a30a91 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/init/pr42844.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/pr42844.C @@ -6,19 +6,19 @@ struct A A(){} }; -struct B : A {}; // { dg-message "user-provided default constructor" } +struct B : A { int i; }; // { dg-message "user-provided default constructor" } -struct C : A {}; // { dg-message "user-provided default constructor" } +struct C : A { int i; }; // { dg-message "user-provided default constructor" } struct D : B { D() {} }; -struct E {}; // { dg-message "user-provided default constructor" } +struct E { int i; }; // { dg-message "user-provided default constructor" } template <class T> -struct F : A {}; // { dg-message "user-provided default constructor" } +struct F : A { T t; }; // { dg-message "user-provided default constructor" } template <class T> -struct G {}; // { dg-message "user-provided default constructor" } +struct G { T t; }; // { dg-message "user-provided default constructor" } void f () { @@ -41,9 +41,9 @@ void f () extern G<int> const gext; } -struct H {}; // { dg-message "user-provided default constructor" } +struct H { int i; }; // { dg-message "user-provided default constructor" } -struct I : A {}; // { dg-message "user-provided default constructor" } +struct I : A { int i; }; // { dg-message "user-provided default constructor" } template <class T> void g () diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/ref20.C b/gcc-4.6/gcc/testsuite/g++.dg/init/ref20.C new file mode 100644 index 000000000..b64cb57e0 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/ref20.C @@ -0,0 +1,8 @@ +// PR c++/50787 +// { dg-do run } + +int main() { + const int Ci = 0; + const int &rCi = Ci; + if (!(&Ci == &rCi)) __builtin_abort(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/value10.C b/gcc-4.6/gcc/testsuite/g++.dg/init/value10.C new file mode 100644 index 000000000..2066410a0 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/value10.C @@ -0,0 +1,27 @@ +// PR c++/51331 +// { dg-do run } + +struct A { + A(): x(10) {} + virtual ~A() {} + + int x; +}; + +struct B: public virtual A { +}; + +struct C: public virtual A { +}; + +struct D: public B, virtual public C { + D(): B(), C() {} // note an explicit call to C() which is auto-generated +}; + +int main() { + D* d = new D(); + + // Crashes here with the following message: + // *** glibc detected *** ./test: free(): invalid next size (fast) + delete d; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/value9.C b/gcc-4.6/gcc/testsuite/g++.dg/init/value9.C new file mode 100644 index 000000000..4899bd810 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/value9.C @@ -0,0 +1,32 @@ +// PR c++/50793 +// { dg-do run } + +struct NonTrivial +{ + NonTrivial() { } +}; + +struct S +{ + NonTrivial nt; + int i; +}; + +int f(S s) +{ + s.i = 0xdeadbeef; + return s.i; +} + +int g(S s = S()) +{ + return s.i; +} + +int main() +{ + f(S()); // make stack dirty + + if ( g() ) + __builtin_abort(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/init/vbase1.C b/gcc-4.6/gcc/testsuite/g++.dg/init/vbase1.C new file mode 100644 index 000000000..bbfd58f5c --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/init/vbase1.C @@ -0,0 +1,39 @@ +// PR c++/50618 +// { dg-do run } + +struct Base +{ + const int text; + Base():text(1) {} + Base(int aText) + : text(aText) {} +}; +struct SubA : public virtual Base +{ +protected: + int x; +public: + SubA(int aX) + : x(aX) {} +}; +class SubB : public virtual Base +{}; +struct Diamond : public SubA, public SubB +{ + Diamond(int text) + : Base(text), SubA(5), SubB() {} + + void printText() + { + if(text != 2) + __builtin_abort(); + if(x!=5) + __builtin_abort(); + } +}; + +int main(int, char**) +{ + Diamond x(2); + x.printText(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/mversn10.C b/gcc-4.6/gcc/testsuite/g++.dg/mversn10.C index adfbc1370..9d9bcd564 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/mversn10.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/mversn10.C @@ -49,6 +49,6 @@ main () return 0; } -/* { dg-final { scan-tree-dump "dispatchv_clone_0" "optimized" } } */ -/* { dg-final { scan-tree-dump "dispatchv_clone_1" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone\.0" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone\.1" "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/mversn10a.C b/gcc-4.6/gcc/testsuite/g++.dg/mversn10a.C index cf510f95c..738bfa932 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/mversn10a.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/mversn10a.C @@ -32,6 +32,6 @@ fn2 () return 0; } -/* { dg-final { scan-tree-dump "dispatchv_clone_0" "optimized" } } */ -/* { dg-final { scan-tree-dump "dispatchv_clone_1" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone\.0" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone\.1" "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/mversn16.C b/gcc-4.6/gcc/testsuite/g++.dg/mversn16.C index d19dca9b8..0fca33a62 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/mversn16.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/mversn16.C @@ -35,5 +35,5 @@ int main () return 0; } -/* { dg-final { scan-tree-dump "dispatchv_clone" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone" "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/mversn8.C b/gcc-4.6/gcc/testsuite/g++.dg/mversn8.C index 39c953bfc..d66867033 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/mversn8.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/mversn8.C @@ -38,8 +38,8 @@ main (int argc, char **argv) return (*ptr)(); } -/* { dg-final { scan-tree-dump "dispatchv_clone_0" "optimized" } } */ -/* { dg-final { scan-tree-dump "dispatchv_clone_1" "optimized" } } */ -/* { dg-final { scan-tree-dump "main_clone_0" "optimized" } } */ -/* { dg-final { scan-tree-dump "main_clone_1" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone\.0" "optimized" } } */ +/* { dg-final { scan-tree-dump "dispatchv\.clone\.1" "optimized" } } */ +/* { dg-final { scan-tree-dump "main\.clone\.0" "optimized" } } */ +/* { dg-final { scan-tree-dump "main\.clone\.1" "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/other/enum2.C b/gcc-4.6/gcc/testsuite/g++.dg/other/enum2.C new file mode 100644 index 000000000..3a28f2532 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/other/enum2.C @@ -0,0 +1,3 @@ +// PR c++/51248 + +enum E { e = sizeof(const E*) }; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/other/offsetof7.C b/gcc-4.6/gcc/testsuite/g++.dg/other/offsetof7.C new file mode 100644 index 000000000..0ce2ee02a --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/other/offsetof7.C @@ -0,0 +1,17 @@ +// PR c++/50608 +// Testcase by <dberger@oubliette.org> +// { dg-do compile } + +struct A { + int offset; +}; + +struct B: public A { +}; + +struct C { + A a; + B b; +}; + +int fails = __builtin_offsetof (C, b.offset); diff --git a/gcc-4.6/gcc/testsuite/g++.dg/other/pr50464.C b/gcc-4.6/gcc/testsuite/g++.dg/other/pr50464.C new file mode 100644 index 000000000..8c6721373 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/other/pr50464.C @@ -0,0 +1,170 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-O3 -mxop" } + +typedef long unsigned int size_t; +typedef unsigned long ulong_t; +typedef signed long slong_t; + + template<typename _Iterator> + struct iterator_traits + { + typedef typename _Iterator::reference reference; + }; + + template<typename _Tp> + struct iterator_traits<_Tp*> + { + typedef _Tp& reference; + }; + + template<typename _Iterator, typename _Container> + class __normal_iterator + { + protected: + _Iterator _M_current; + typedef iterator_traits<_Iterator> __traits_type; + + public: + typedef typename __traits_type::reference reference; + + explicit + __normal_iterator(const _Iterator& __i) : _M_current(__i) { } + + reference + operator*() const + { return *_M_current; } + + __normal_iterator& + operator++() + { + ++_M_current; + return *this; + } + + const _Iterator& + base() const + { return _M_current; } + }; + + template<typename _Iterator, typename _Container> + inline bool + operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + { return __lhs.base() != __rhs.base(); } + + template<typename _Tp> + class allocator + { + public: + typedef _Tp* pointer; + typedef _Tp value_type; + + template<typename _Tp1> + struct rebind + { typedef allocator<_Tp1> other; }; + + pointer allocate(size_t __n, const void* = 0) + { + return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); + } + }; + + template<typename _Tp, typename _Alloc> + struct _Vector_base + { + typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; + + struct _Vector_impl + : public _Tp_alloc_type + { + typename _Tp_alloc_type::pointer _M_start; + typename _Tp_alloc_type::pointer _M_finish; + typename _Tp_alloc_type::pointer _M_end_of_storage; + + _Vector_impl(_Tp_alloc_type const& __a) { } + }; + + public: + typedef _Alloc allocator_type; + + _Vector_base(size_t __n, const allocator_type& __a) + : _M_impl(__a) + { + this->_M_impl._M_start = this->_M_allocate(__n); + this->_M_impl._M_finish = this->_M_impl._M_start; + this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; + } + + public: + _Vector_impl _M_impl; + + typename _Tp_alloc_type::pointer + _M_allocate(size_t __n) + { return __n != 0 ? _M_impl.allocate(__n) : 0; } + + }; + + template<typename _Tp, typename _Alloc = allocator<_Tp> > + class vector : protected _Vector_base<_Tp, _Alloc> + { + typedef _Vector_base<_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + + public: + typedef _Tp value_type; + typedef typename _Tp_alloc_type::pointer pointer; + typedef __normal_iterator<pointer, vector> iterator; + typedef _Alloc allocator_type; + + protected: + using _Base::_M_allocate; + using _Base::_M_impl; + + public: + + explicit + vector(size_t __n, const value_type& __value = value_type(), + const allocator_type& __a = allocator_type()) + : _Base(__n, __a) + { _M_fill_initialize(__n, __value); } + + iterator begin() + { return iterator(this->_M_impl._M_start); } + + iterator end() + { return iterator(this->_M_impl._M_finish); } + + protected: + void + _M_fill_initialize(size_t __n, const value_type& __value) + { + this->_M_impl._M_finish = this->_M_impl._M_end_of_storage; + } + }; + + template<typename _InputIterator, typename _OutputIterator, typename _Tp> + _OutputIterator + replace_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, + const _Tp& __old_value, const _Tp& __new_value) + { + ; + for (; __first != __last; ++__first, ++__result) + if (*__first == __old_value) + *__result = __new_value; + else + *__result = *__first; + return __result; + } + +extern size_t shape_rank; + +void createDataspaceIdentifier() +{ + vector< ulong_t > dataspaceDims( shape_rank ); + vector< ulong_t > maxDataspaceDims( shape_rank ); + + replace_copy( + dataspaceDims.begin(), dataspaceDims.end(), + maxDataspaceDims.begin(), ulong_t( 0 ), ((ulong_t)(slong_t)(-1)) ); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/other/sized-delete-1.C b/gcc-4.6/gcc/testsuite/g++.dg/other/sized-delete-1.C new file mode 100644 index 000000000..76f861af3 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/other/sized-delete-1.C @@ -0,0 +1,14 @@ +// { dg-do link} +// { dg-options "-O -fsized-delete" } +// { dg-final { scan-assembler "_ZdlPv\[mj\]" } } +struct A +{ + int a[100]; +}; + +int main(void) +{ + A *a = new A; + delete a; + return 0; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/pr44486.C b/gcc-4.6/gcc/testsuite/g++.dg/pr44486.C index 01e84289f..1a23d57b5 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/pr44486.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/pr44486.C @@ -7,4 +7,4 @@ namespace { S f() { const char * s = __PRETTY_FUNCTION__; return S(); } } int main() { f(); } -// { dg-final { scan-assembler "S \{anonymous\}::f" } } +// { dg-final { scan-assembler "S \\(anonymous namespace\\)::f" } } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/pr48660.C b/gcc-4.6/gcc/testsuite/g++.dg/pr48660.C new file mode 100644 index 000000000..37b61741a --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/pr48660.C @@ -0,0 +1,22 @@ +template<int N> struct val { char a[N]; }; + +class Base +{ +public: + virtual val<1> get1() const = 0; + virtual val<2> get2() const = 0; + virtual val<3> get3() const = 0; + virtual val<4> get4() const = 0; +}; + +class Derived : public virtual Base +{ +public: + virtual val<1> get1() const { return foo->get1(); } + virtual val<2> get2() const { return foo->get2(); } + virtual val<3> get3() const { return foo->get3(); } + virtual val<4> get4() const { return foo->get4(); } + Base *foo; +}; + +Base* make() { return new Derived; } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/pr51151.C b/gcc-4.6/gcc/testsuite/g++.dg/pr51151.C new file mode 100644 index 000000000..804498b5f --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/pr51151.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Woverflow" } */ +template<typename T> class C { +public: + void f() { + m = c2 + 1; + } + static const long unsigned int c1 = 7; + static const int c2 = c1 - 1; + int m; +}; +template class C<int>; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/template/partial12.C b/gcc-4.6/gcc/testsuite/g++.dg/template/partial12.C new file mode 100644 index 000000000..05a3eca97 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/template/partial12.C @@ -0,0 +1,27 @@ +// PR c++/46105 + +template< typename T > +struct empty { // support class is like stripped-down enable_if + typedef void type; +}; + +template< class T, typename v = void > // v is always void! +struct element { + typedef typename T::value_type type; +}; + +template< class T > // T in deduced context, T::element_type is SFINAE: +struct element< T, typename empty< typename T::element_type >::type > { + typedef typename T::element_type type; +}; + +template< class T > +struct element< T const, typename empty< typename T::element_type >::type > { + typedef typename T::element_type const type; +}; + +struct has_et { + typedef int element_type; +}; + +element<has_et const>::type ip = 0; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-79.C b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-79.C index 8558670f0..b3c93b4b7 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-79.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-79.C @@ -75,3 +75,27 @@ void foo3() (new FooDerived)->doSomething(); } +class FooNodef; + +// test case for cast from undefined type +void foo4(FooNodef *f) { + ((Foo*) f)->doSomething(); +} + + +// Regression test for canonicalization of subexpressions that refer to +// lockable objects. +class LOCKABLE Base { +public: + Mutex mu_; + virtual void baseMethod() SHARED_LOCKS_REQUIRED(mu_) = 0; +}; + +class Derived : public Base { +public: + void foo() SHARED_LOCKS_REQUIRED(mu_); +}; + +void Derived::foo() { + baseMethod(); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-81.C b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-81.C new file mode 100644 index 000000000..5db3ccc1c --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-81.C @@ -0,0 +1,17 @@ +// Test template methods in the presence of cloned constructors. +// Regression test for bugfix. +// { dg-do compile } +// { dg-options "-Wthread-safety -O" } + +#include "thread_annot_common.h" + +Mutex mu_; +Mutex mu2_; + +class Foo { + Foo() LOCKS_EXCLUDED(mu_) { } + + template <class T> + void bar(T* t) LOCKS_EXCLUDED(mu2_) { } +}; + diff --git a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-82.C b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-82.C new file mode 100644 index 000000000..556bab676 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-82.C @@ -0,0 +1,48 @@ +// Regression tests: fix ICE issues when IPA-SRA deletes formal +// function parameters. +// { dg-do compile } +// { dg-options "-Wthread-safety -O3" } + +#include "thread_annot_common.h" + +class Foo; +void do_something(void* a); + +class Foo { + Mutex mu_; + int a GUARDED_BY(mu_); + int b; + + // with optimization turned on, ipa-sra should eliminate the hidden + // "this" argument, thus invalidating EXCLUSIVE_LOCKS_REQUIRED. + inline void clone_me_ipasra(Foo* f) EXCLUSIVE_LOCKS_REQUIRED(mu_) { + do_something(f); + } + + void foo(Foo* f); + void bar(); +}; + +void Foo::foo(Foo* f) { + mu_.Lock(); + // in the cloned version, it looks like the required lock is f->mu_ + // we should detect this and ignore the attribute. + clone_me_ipasra(f); + mu_.Unlock(); +} + + +class SCOPED_LOCKABLE DummyMutexLock { +public: + // IPA-SRA should kill the parameters to these functions + explicit DummyMutexLock(Mutex* mutex) EXCLUSIVE_LOCK_FUNCTION(mutex) {} + ~DummyMutexLock() UNLOCK_FUNCTION() {} +}; + + +void Foo::bar() { + // Matches two warnings: + DummyMutexLock dlock(&mu_); // { dg-warning "lock attribute has been removed by optimization" } + a = 1; // warning here should be suppressed, due to errors handling dlock + b = 2; // { dg-warning "unlock attribute has been removed by optimization" } +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-83.C b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-83.C new file mode 100644 index 000000000..35e58c09e --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-83.C @@ -0,0 +1,55 @@ +// Regression test for two bugfixes. +// Bugfix 1: Shared locks are not properly removed from locksets +// if a "universal lock" is present. +// Bugfix 2: Canonicalization does not properly store the lock in +// the hash table if the lock function is attached to a base class. +// { dg-do compile } +// { dg-options "-Wthread-safety" } + +#include "thread_annot_common.h" + +class Foo; + +/* Bugfix 1 */ +class Bar { +public: + Foo* foo; + Mutex mu_; + + // foo->mu_ is not visible at this point in the code. + // so the attribute will become a "universal lock." + void bar() EXCLUSIVE_LOCKS_REQUIRED(foo->mu_); +}; + + +class Foo { +public: + Mutex mu_; + int a; +}; + + +void Bar::bar() { + ReaderMutexLock rlock(&mu_); +} + + +/* Bugfix 2 */ +class LOCKABLE Base { +public: + Mutex mu_; + + void Lock() EXCLUSIVE_LOCK_FUNCTION() { mu_.Lock(); } + void Unlock() UNLOCK_FUNCTION() { mu_.Unlock(); } +}; + +class Derived : public Base { +public: + int b; +}; + +void doSomething(Derived *d) { + d->Lock(); + d->Unlock(); +}; + diff --git a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-84.C b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-84.C new file mode 100644 index 000000000..323b4e303 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-84.C @@ -0,0 +1,29 @@ +// Test lock expressions involving array elements. +// { dg-do compile } +// { dg-options "-Wthread-safety" } + +#include "thread_annot_common.h" + +struct Foo { + Mutex mu_; + int a GUARDED_BY(mu_); + + static void foo1(Foo* foos, int n); + static void foo2(Foo* foos, int n); +}; + +void Foo::foo1(Foo* foos, int n) { + for (int i = 0; i < n; ++i) { + foos[i].mu_.Lock(); + foos[i].a = 0; + foos[i].mu_.Unlock(); + } +} + +void Foo::foo2(Foo* foos, int n) { + for (int i = 0; i < n-1; ++i) { + foos[i].mu_.Lock(); + foos[i+1].a = 0; // { dg-warning "Writing to variable" } + foos[i].mu_.Unlock(); + } +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-85.C b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-85.C new file mode 100644 index 000000000..c553e81d6 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/thread-ann/thread_annot_lock-85.C @@ -0,0 +1,22 @@ +// Regression test, handle trylock on virtual method. +// { dg-do compile } +// { dg-options "-Wthread-safety" } + +#include "thread_annot_common.h" + +class LOCKABLE Lock { + public: + virtual ~Lock() {} + virtual bool TryLock() EXCLUSIVE_TRYLOCK_FUNCTION(true) { return true; } + void Unlock() UNLOCK_FUNCTION() {} +}; + + +void foo() { + Lock x; + Lock *p = &x; + if (p->TryLock()) { + p->Unlock(); + } +} + diff --git a/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49309.C b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49309.C new file mode 100644 index 000000000..a34537792 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49309.C @@ -0,0 +1,15 @@ +// PR tree-optimization/49309 +// { dg-do compile } +// { dg-options "-fpreprocessed -fmudflap" } + +struct A +{ + int i; + + A(); + A(const A&); +}; + +inline void foo(A a) { a = A(); } + +void bar() { foo(A()); } diff --git a/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49628.C b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49628.C new file mode 100644 index 000000000..4bc6543a3 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49628.C @@ -0,0 +1,37 @@ +/* { dg-do compile } */ + +#include <vector> + +template <int rank, int dim> class Tensor; +template <int dim> class Tensor<1,dim> { +public: + explicit Tensor (const bool initialize = true); + Tensor (const Tensor<1,dim> &); + Tensor<1,dim> & operator = (const Tensor<1,dim> &); + double values[(dim!=0) ? (dim) : 1]; +}; +template <int dim> +inline Tensor<1,dim> & Tensor<1,dim>::operator = (const Tensor<1,dim> &p) +{ + for (unsigned int i=0; i<dim; ++i) + values[i] = p.values[i]; +}; +template <int dim> class Quadrature { +public: + const unsigned int n_quadrature_points; +}; +class MappingQ1 +{ + class InternalData { + public: + std::vector<Tensor<1,3> > shape_derivatives; + unsigned int n_shape_functions; + }; + void compute_data (const Quadrature<3> &quadrature, InternalData &data) + const; +}; +void MappingQ1::compute_data (const Quadrature<3> &q, InternalData &data) const +{ + const unsigned int n_q_points = q.n_quadrature_points; + data.shape_derivatives.resize(data.n_shape_functions * n_q_points); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49720.C b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49720.C new file mode 100644 index 000000000..c5da7ba67 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr49720.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +extern char t_start[], t_end[], t_size[]; +bool foo (void) +{ + long size = reinterpret_cast<long>(t_size); + return (size == t_end - t_start); +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/torture/pr50189.C b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr50189.C new file mode 100644 index 000000000..06f1d3695 --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/torture/pr50189.C @@ -0,0 +1,121 @@ +// { dg-do run } +// { dg-options "-fstrict-enums" } + +extern "C" void abort (void); +class CCUTILS_KeyedScalarLevelPosition +{ +public: + + typedef enum + { + UNINITED = 0, + AT_BEGIN = 1, + AT_END = 2, + AT_KEY = 3 + + } position_t; + + bool is_init() const + { return(m_timestamp != UNINITED); } + + bool is_at_begin() const + { return(m_timestamp == AT_BEGIN); } + + position_t get_state() const + { + return((m_timestamp >= AT_KEY) + ? AT_KEY + : ((position_t)m_timestamp)); + } + + void set_at_begin() + { m_timestamp = AT_BEGIN; } + + unsigned int get_index() const + { return(m_index); } + + void set_pos(unsigned int a_index, unsigned int a_timestmap) + { + m_index = a_index; + m_timestamp = a_timestmap; + } + + bool check_pos(unsigned int a_num_entries, unsigned int a_timestamp) const + { + if (get_state() != AT_KEY) + return(false); + + if (m_timestamp != a_timestamp) + return(false); + + return(m_index < a_num_entries); + } + + void set_not_init() + { m_timestamp = 0; } + +private: + + unsigned int m_timestamp; + unsigned int m_index; + +}; + +class CCUTILS_KeyedScalarPosition +{ +public: + + CCUTILS_KeyedScalarLevelPosition m_L1; + CCUTILS_KeyedScalarLevelPosition m_L2; +}; + +class baz +{ +public: + int *n[20]; + unsigned int m_cur_array_len; + unsigned int m_timestamp; + + unsigned int _get_timestamp() const + { return(m_timestamp); } + + bool _check_L1_pos(const CCUTILS_KeyedScalarPosition &a_position) const + { + return(a_position.m_L1.check_pos( + m_cur_array_len, _get_timestamp())); + } + + void *next (CCUTILS_KeyedScalarPosition &); +}; + +void * baz::next (CCUTILS_KeyedScalarPosition &a_position) +{ + if (a_position.m_L1.is_at_begin() || (!a_position.m_L1.is_init())) + { + a_position.m_L1.set_pos(0, _get_timestamp()); + a_position.m_L2.set_at_begin(); + } + else if (!_check_L1_pos(a_position)) + return(0); + + return n[a_position.m_L1.get_index ()]; +} + +int main (int, char **) +{ + baz obj; + CCUTILS_KeyedScalarPosition a_pos; + void *ret; + int n[5]; + + obj.n[0] = n; + obj.m_cur_array_len = 1; + obj.m_timestamp = 42; + + a_pos.m_L1.set_pos (0, 42); + + ret = obj.next (a_pos); + if (ret == 0) + abort (); + return 0; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/callgraph-profiles.C b/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/callgraph-profiles.C new file mode 100644 index 000000000..d9583097c --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/callgraph-profiles.C @@ -0,0 +1,30 @@ +/* Verify if call-graph profile sections are created + with -fcallgraph-profiles-sections. */ +/* { dg-options "-O2 -fcallgraph-profiles-sections -ffunction-sections --save-temps" } */ +/* { dg-require-section-exclude "" } */ + +int __attribute__ ((noinline)) +foo () +{ + return 1; +} + +int __attribute__ ((noinline)) +bar () +{ + return 0; +} + +int main () +{ + int sum; + for (int i = 0; i< 1000; i++) + { + sum = foo () + bar(); + } + return sum * bar (); +} + +/* { dg-final-use { scan-assembler "\.gnu\.callgraph\.text\.main" } } */ +/* { dg-final-use { scan-assembler "\.string \"1000\"" } } */ +/* { dg-final-use { cleanup-saved-temps } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/mversn15.C b/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/mversn15.C index 54b4e57a1..cdbb70ed1 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/mversn15.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/tree-prof/mversn15.C @@ -18,6 +18,6 @@ main () return ret - 1000; } -/* { dg-final-use { scan-tree-dump "main_clone" "optimized" } } */ +/* { dg-final-use { scan-tree-dump "main\.clone" "optimized" } } */ /* { dg-final-use { scan-tree-dump "return 0" "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C b/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C index 5513d3650..91f43ae8c 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C @@ -1,7 +1,7 @@ // PR tree-optimization/39557 // invalid post-dom info leads to infinite loop // { dg-do run } -// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fno-rtti" } +// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fopt-info -fno-rtti" } struct C { diff --git a/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/pr49911.C b/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/pr49911.C new file mode 100644 index 000000000..520a7750d --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/pr49911.C @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fstrict-enums -fno-rtti -fno-exceptions -fno-strict-aliasing -fdump-tree-vrp2" } */ + + +extern void JS_Assert(); +typedef enum { +eax, ecx, edx, ebx, esp, ebp, +esi, edi } +RegisterID; +union StateRemat { + RegisterID reg_; + int offset_; +}; +static StateRemat FromRegister(RegisterID reg) { + StateRemat sr; + sr.reg_ = reg; + return sr; +} +static StateRemat FromAddress3(int address) { + StateRemat sr; + sr.offset_ = address; + //sr.offset_ = 0; + if (address < 46 && address >= 0) { + JS_Assert(); + } + return sr; +} +struct FrameState { + StateRemat dataRematInfo2(bool y, int z) { + if (y) return FromRegister(RegisterID(1)); + return FromAddress3(z); + } +}; +FrameState frame; +StateRemat x; +void jsop_setelem(bool y, int z) { + x = frame.dataRematInfo2(y, z); +} + +/* { dg-final { scan-tree-dump-times "Folding predicate.*45" 0 "vrp2"} } */ +/* { dg-final { cleanup-tree-dump "vrp2" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/pr50622.C b/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/pr50622.C new file mode 100644 index 000000000..d7f4fa74b --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/tree-ssa/pr50622.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// { dg-options "-O2" } + +typedef __complex__ double Value; +struct LorentzVector +{ + LorentzVector & operator+=(const LorentzVector & a) { + theX += a.theX; + theY += a.theY; + theZ += a.theZ; + theT += a.theT; + return *this; + } + + Value theX; + Value theY; + Value theZ; + Value theT; +}; + +inline LorentzVector +operator+(LorentzVector a, const LorentzVector & b) { + return a += b; +} + +Value ex, et; +LorentzVector sum() { + LorentzVector v1; v1.theX =ex; v1.theY =ex+et; v1.theZ =ex-et; v1.theT =et; + return v1+v1; +} diff --git a/gcc-4.6/gcc/testsuite/g++.dg/vect/pr51485.cc b/gcc-4.6/gcc/testsuite/g++.dg/vect/pr51485.cc new file mode 100644 index 000000000..d57d7596d --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/vect/pr51485.cc @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +struct A { A (); unsigned int a; }; +double bar (A a) throw () __attribute__((pure)); + +void +foo (unsigned int x, double *y, A *z) +{ + unsigned int i; + for (i = 0; i < x; i++) + y[i] = bar (z[i]); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc-4.6/gcc/testsuite/g++.dg/vect/slp-pr50413.cc b/gcc-4.6/gcc/testsuite/g++.dg/vect/slp-pr50413.cc new file mode 100644 index 000000000..e7bdf1f1c --- /dev/null +++ b/gcc-4.6/gcc/testsuite/g++.dg/vect/slp-pr50413.cc @@ -0,0 +1,165 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +typedef unsigned long long UInt64; + +typedef struct struct128 +{ + UInt64 uint64_lower; + UInt64 uint64_upper; +} +STRUCT_128; + +typedef union uint128_bitmap +{ + STRUCT_128 uint128; + + struct + { + UInt64 b00 : 1; + UInt64 b01 : 1; + UInt64 b02 : 1; + UInt64 b03 : 1; + UInt64 b04 : 1; + UInt64 b05 : 1; + UInt64 b06 : 1; + UInt64 b07 : 1; + UInt64 b08 : 1; + UInt64 b09 : 1; + UInt64 b10 : 1; + UInt64 b11 : 1; + UInt64 b12 : 1; + UInt64 b13 : 1; + UInt64 b14 : 1; + UInt64 b15 : 1; + UInt64 b16 : 1; + UInt64 b17 : 1; + UInt64 b18 : 1; + UInt64 b19 : 1; + UInt64 b20 : 1; + UInt64 b21 : 1; + UInt64 b22 : 1; + UInt64 b23 : 1; + UInt64 b24 : 1; + UInt64 b25 : 1; + UInt64 b26 : 1; + UInt64 b27 : 1; + UInt64 b28 : 1; + UInt64 b29 : 1; + UInt64 b30 : 1; + UInt64 b31 : 1; + UInt64 b32 : 1; + UInt64 b33 : 1; + UInt64 b34 : 1; + UInt64 b35 : 1; + UInt64 b36 : 1; + UInt64 b37 : 1; + UInt64 b38 : 1; + UInt64 b39 : 1; + UInt64 b40 : 1; + UInt64 b41 : 1; + UInt64 b42 : 1; + UInt64 b43 : 1; + UInt64 b44 : 1; + UInt64 b45 : 1; + UInt64 b46 : 1; + UInt64 b47 : 1; + UInt64 b48 : 1; + UInt64 b49 : 1; + UInt64 b50 : 1; + UInt64 b51 : 1; + UInt64 b52 : 1; + UInt64 b53 : 1; + UInt64 b54 : 1; + UInt64 b55 : 1; + UInt64 b56 : 1; + UInt64 b57 : 1; + UInt64 b58 : 1; + UInt64 b59 : 1; + UInt64 b60 : 1; + UInt64 b61 : 1; + UInt64 b62 : 1; + UInt64 b63 : 1; + UInt64 b64 : 1; + UInt64 b65 : 1; + UInt64 b66 : 1; + UInt64 b67 : 1; + UInt64 b68 : 1; + UInt64 b69 : 1; + UInt64 b70 : 1; + UInt64 b71 : 1; + UInt64 b72 : 1; + UInt64 b73 : 1; + UInt64 b74 : 1; + UInt64 b75 : 1; + UInt64 b76 : 1; + UInt64 b77 : 1; + UInt64 b78 : 1; + UInt64 b79 : 1; + UInt64 b80 : 1; + UInt64 b81 : 1; + UInt64 b82 : 1; + UInt64 b83 : 1; + UInt64 b84 : 1; + UInt64 b85 : 1; + UInt64 b86 : 1; + UInt64 b87 : 1; + UInt64 b88 : 1; + UInt64 b89 : 1; + UInt64 b90 : 1; + UInt64 b91 : 1; + UInt64 b92 : 1; + UInt64 b93 : 1; + UInt64 b94 : 1; + UInt64 b95 : 1; + UInt64 b96 : 1; + UInt64 b97 : 1; + UInt64 b98 : 1; + UInt64 b99 : 1; + UInt64 b100 : 1; + UInt64 b101 : 1; + UInt64 b102 : 1; + UInt64 b103 : 1; + UInt64 b104 : 1; + UInt64 b105 : 1; + UInt64 b106 : 1; + UInt64 b107 : 1; + UInt64 b108 : 1; + UInt64 b109 : 1; + UInt64 b110 : 1; + UInt64 b111 : 1; + UInt64 b112 : 1; + UInt64 b113 : 1; + UInt64 b114 : 1; + UInt64 b115 : 1; + UInt64 b116 : 1; + UInt64 b117 : 1; + UInt64 b118 : 1; + UInt64 b119 : 1; + UInt64 b120 : 1; + UInt64 b121 : 1; + UInt64 b122 : 1; + UInt64 b123 : 1; + UInt64 b124 : 1; + UInt64 b125 : 1; + UInt64 b126 : 1; + UInt64 b127 : 1; + } + bitmap; +} +UInt128_BITMAP; + +UInt128_BITMAP V; + +void shift(unsigned char t) +{ + V.uint128.uint64_lower = (V.uint128.uint64_lower >> 1); + V.bitmap.b63 = V.bitmap.b64; + V.uint128.uint64_upper = (V.uint128.uint64_upper >> 1); + + V.bitmap.b96 = t; +} + +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 0 "slp" } } */ +/* { dg-final { cleanup-tree-dump "slp" } } */ + diff --git a/gcc-4.6/gcc/testsuite/g++.dg/vect/vect.exp b/gcc-4.6/gcc/testsuite/g++.dg/vect/vect.exp index 9a03f6c42..ac22f4b01 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/vect/vect.exp +++ b/gcc-4.6/gcc/testsuite/g++.dg/vect/vect.exp @@ -40,8 +40,13 @@ global DEFAULT_VECTCFLAGS set DEFAULT_VECTCFLAGS "" # These flags are used for all targets. -lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" "-fno-vect-cost-model" \ - "-ftree-vectorizer-verbose=4" "-fdump-tree-vect-stats" +lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" "-fno-vect-cost-model" + +set VECT_SLP_CFLAGS $DEFAULT_VECTCFLAGS + +lappend DEFAULT_VECTCFLAGS "-fdump-tree-vect-details" +lappend VECT_SLP_CFLAGS "-fdump-tree-slp-details" + # Skip these tests for targets that do not support generating vector # code. Set additional target-dependent vector flags, which can be @@ -54,8 +59,10 @@ if ![check_vect_support_and_set_flags] { dg-init # Main loop. -dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{c,cc,S} ]] \ +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr*.{c,cc,S} ]] \ "" $DEFAULT_VECTCFLAGS +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/slp-pr*.{c,cc,S} ]] \ + "" $VECT_SLP_CFLAGS #### Tests with special options global SAVED_DEFAULT_VECTCFLAGS diff --git a/gcc-4.6/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C b/gcc-4.6/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C index 1c37e3ea0..9d889e1d6 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C @@ -8,7 +8,7 @@ public: }; class Y { - const int var;// { dg-warning "non-static const member 'const int Y::var' in class without a constructor" } + const int var;// { dg-warning "non-static const member 'int const Y::var' in class without a constructor" } public: int g(){ return 2*var; } }; diff --git a/gcc-4.6/gcc/testsuite/g++.dg/warn/pr35711.C b/gcc-4.6/gcc/testsuite/g++.dg/warn/pr35711.C index 653269c0e..7c1be1c4e 100644 --- a/gcc-4.6/gcc/testsuite/g++.dg/warn/pr35711.C +++ b/gcc-4.6/gcc/testsuite/g++.dg/warn/pr35711.C @@ -4,5 +4,5 @@ int* foo (volatile int *p) { - return (int*)p; // { dg-warning "cast from type 'volatile int\\*' to type 'int\\*' casts away qualifiers" } + return (int*)p; // { dg-warning "cast from type 'int volatile\\*' to type 'int\\*' casts away qualifiers" } } |