aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/semantics.c5
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/g++.dg/ext/has_nothrow_assign.C12
-rw-r--r--gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C16
-rw-r--r--gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C4
-rw-r--r--gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C16
-rw-r--r--gcc/testsuite/g++.dg/ext/has_nothrow_copy.C12
-rw-r--r--gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C16
9 files changed, 75 insertions, 23 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2112b8f..913f328 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2008-07-21 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/36870
+ * semantics.c (classtype_has_nothrow_assign_or_copy_p): Use
+ TYPE_NOTHROW_P, not TREE_NOTHROW.
+ (trait_expr_value): Likewise.
+
2008-07-18 Dodji Seketeli <dseketel@redhat.com>
PR c++/36407
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index d2f56ea..3b91ddb 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4677,7 +4677,7 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
return false;
for (; fns; fns = OVL_NEXT (fns))
- if (!TREE_NOTHROW (OVL_CURRENT (fns)))
+ if (!TYPE_NOTHROW_P (TREE_TYPE (OVL_CURRENT (fns))))
return false;
return true;
@@ -4712,7 +4712,8 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
type1 = strip_array_types (type1);
return (trait_expr_value (CPTK_HAS_TRIVIAL_CONSTRUCTOR, type1, type2)
|| (CLASS_TYPE_P (type1)
- && (t = locate_ctor (type1, NULL)) && TREE_NOTHROW (t)));
+ && (t = locate_ctor (type1, NULL))
+ && TYPE_NOTHROW_P (TREE_TYPE (t))));
case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
type1 = strip_array_types (type1);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bd32d6c..13f1468 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2008-07-21 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/36870
+ * g++.dg/ext/has_nothrow_assign_odr.C: New.
+ * g++.dg/ext/has_nothrow_copy_odr.C: Likewise.
+ * g++.dg/ext/has_nothrow_constructor_odr.C: Likewise.
+ * g++.dg/ext/has_nothrow_assign.C: Adjust.
+ * g++.dg/ext/has_nothrow_copy.C: Likewise.
+ * g++.dg/ext/has_nothrow_constructor.C: Likewise.
+
2008-07-17 Andreas Krebbel <krebbel1@de.ibm.com>
PR target/36822
diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C b/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C
index 525cac7..73a904e 100644
--- a/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C
+++ b/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C
@@ -136,19 +136,13 @@ int main()
assert (PTEST (C));
assert (NTEST (C[]));
assert (PTEST (D));
-#ifndef __PIC__
- assert (PTEST (E));
-#endif
+ assert (NTEST (E));
assert (NTEST (E1));
assert (PTEST (F));
assert (PTEST (G));
-#ifndef __PIC__
- assert (PTEST (H));
-#endif
+ assert (NTEST (H));
assert (NTEST (H1));
-#ifndef __PIC__
- assert (PTEST (I));
-#endif
+ assert (NTEST (I));
assert (NTEST (I1));
assert (PTEST (J));
assert (NTEST (const K));
diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C b/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C
new file mode 100644
index 0000000..c38d76d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C
@@ -0,0 +1,16 @@
+// PR c++/36870
+// { dg-do "run" }
+#include <cassert>
+
+struct S { const S& operator= (const S&); };
+
+bool f ();
+
+int main ()
+{
+ assert (__has_nothrow_assign (S) == f ());
+}
+
+const S& S::operator= (const S&) { }
+
+bool f () { return __has_nothrow_assign (S); }
diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C
index 7e747bc..60e9be8 100644
--- a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C
+++ b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C
@@ -97,9 +97,7 @@ int main()
assert (PTEST (C));
assert (PTEST (C[]));
assert (PTEST (D));
-#ifndef __PIC__
- assert (PTEST (E));
-#endif
+ assert (NTEST (E));
assert (NTEST (E1));
assert (NTEST (F));
assert (NTEST (G));
diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C
new file mode 100644
index 0000000..775e74a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C
@@ -0,0 +1,16 @@
+// PR c++/36870
+// { dg-do "run" }
+#include <cassert>
+
+struct S { S (); };
+
+bool f ();
+
+int main ()
+{
+ assert (__has_nothrow_constructor (S) == f ());
+}
+
+S::S () { }
+
+bool f () { return __has_nothrow_constructor (S); }
diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy.C
index 6843d51..e8507cf 100644
--- a/gcc/testsuite/g++.dg/ext/has_nothrow_copy.C
+++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy.C
@@ -126,19 +126,13 @@ int main()
assert (PTEST (C));
assert (NTEST (C[]));
assert (PTEST (D));
-#ifndef __PIC__
- assert (PTEST (E));
-#endif
+ assert (NTEST (E));
assert (NTEST (E1));
assert (PTEST (F));
assert (PTEST (G));
-#ifndef __PIC__
- assert (PTEST (H));
-#endif
+ assert (NTEST (H));
assert (NTEST (H1));
-#ifndef __PIC__
- assert (PTEST (I));
-#endif
+ assert (NTEST (I));
assert (NTEST (I1));
assert (PTEST (J));
diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C
new file mode 100644
index 0000000..499a11e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C
@@ -0,0 +1,16 @@
+// PR c++/36870
+// { dg-do "run" }
+#include <cassert>
+
+struct S { S (const S&); };
+
+bool f ();
+
+int main ()
+{
+ assert (__has_nothrow_copy (S) == f ());
+}
+
+S::S (const S&) { }
+
+bool f () { return __has_nothrow_copy (S); }