aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C52
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
new file mode 100644
index 0000000..2d37867
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
@@ -0,0 +1,52 @@
+// Runtime test for noexcept-specification.
+// { dg-options "-Wnoexcept" }
+// { dg-do run { target nonpic } }
+// { dg-require-effective-target c++11 }
+
+#include <exception>
+#include <cstdlib>
+
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+void my_unexpected ()
+{
+ throw;
+}
+
+void g() { throw 1; }
+void (*p)() = g;
+void f () noexcept (false)
+{
+ p();
+}
+
+template <class T>
+void f(T) noexcept (noexcept (T())) // { dg-warning "false" }
+{
+ p();
+}
+
+template <class T>
+void f2(T a) noexcept (noexcept (f (a)))
+{
+ f(a);
+}
+
+struct A { A() { } }; // { dg-warning "does not throw" }
+
+int main()
+{
+ // noexcept(false) allows throw.
+ try { f(); } catch (int) { }
+ // noexcept(noexcept(A())) == noexcept(false).
+ try { f(A()); } catch (int) { }
+ try { f2(A()); } catch (int) { }
+
+ std::set_terminate (my_terminate);
+ // noexcept(noexcept(int())) == noexcept(true).
+ try { f2(1); } catch (...) { }
+ return 1;
+}