re PR c++/36871 (__has_nothrow_copy(T) false for T with a template ctor)

/cp
2008-07-21  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/36871
	PR c++/36872
	* semantics.c (classtype_has_nothrow_assign_or_copy_p): Only check
	copy constructors and copy assignment operators proper.

/testsuite
2008-07-21  Paolo Carlini  <paolo.carlini@oracle.com>

        PR c++/36871
	PR c++/36872
        * g++.dg/ext/has_nothrow_copy.C: Rename to...
        * g++.dg/ext/has_nothrow_copy-1.C: ... this.
        * g++.dg/ext/has_nothrow_copy-2.C: New.
        * g++.dg/ext/has_nothrow_copy-3.C: Likewise.
        * g++.dg/ext/has_nothrow_copy-4.C: Likewise.
        * g++.dg/ext/has_nothrow_copy-5.C: Likewise.
        * g++.dg/ext/has_nothrow_copy-6.C: Likewise.
        * g++.dg/ext/has_nothrow_copy-7.C: Likewise.

From-SVN: r138034
This commit is contained in:
Paolo Carlini 2008-07-21 16:18:38 +00:00 committed by Paolo Carlini
parent 099735e9d6
commit 279086c390
10 changed files with 110 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2008-07-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36871
PR c++/36872
* semantics.c (classtype_has_nothrow_assign_or_copy_p): Only check
copy constructors and copy assignment operators proper.
2008-07-21 Rafael Avila de Espindola <espindola@google.com>
* parser.c (cp_token): Remove in_system_header.

View File

@ -4677,8 +4677,20 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
return false;
for (; fns; fns = OVL_NEXT (fns))
if (!TYPE_NOTHROW_P (TREE_TYPE (OVL_CURRENT (fns))))
return false;
{
tree fn = OVL_CURRENT (fns);
if (assign_p)
{
if (copy_fn_p (fn) == 0)
continue;
}
else if (copy_fn_p (fn) <= 0)
continue;
if (!TYPE_NOTHROW_P (TREE_TYPE (fn)))
return false;
}
return true;
}

View File

@ -1,3 +1,16 @@
2008-07-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36871
PR c++/36872
* g++.dg/ext/has_nothrow_copy.C: Rename to...
* g++.dg/ext/has_nothrow_copy-1.C: ... this.
* g++.dg/ext/has_nothrow_copy-2.C: New.
* g++.dg/ext/has_nothrow_copy-3.C: Likewise.
* g++.dg/ext/has_nothrow_copy-4.C: Likewise.
* g++.dg/ext/has_nothrow_copy-5.C: Likewise.
* g++.dg/ext/has_nothrow_copy-6.C: Likewise.
* g++.dg/ext/has_nothrow_copy-7.C: Likewise.
2008-07-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/36773

View File

@ -0,0 +1,12 @@
// PR c++/36871
// { dg-do "run" }
#include <cassert>
struct A { template <class T> A (T) throw (int); };
struct B { B (B&) throw (); template <class T> B (T) throw (int); };
int main ()
{
assert (__has_nothrow_copy (A));
assert (__has_nothrow_copy (B));
}

View File

@ -0,0 +1,13 @@
// PR c++/36871
// { dg-do "run" }
#include <cassert>
struct F {
F (const F&) throw () { }
template <class T> F (T) throw () { }
};
int main ()
{
assert (__has_nothrow_copy (F));
}

View File

@ -0,0 +1,13 @@
// PR c++/36872
// { dg-do "run" }
#include <cassert>
struct S {
S (const S&) throw ();
S (...) throw (int);
};
int main ()
{
assert (__has_nothrow_copy (S));
}

View File

@ -0,0 +1,13 @@
// PR c++/36872
// { dg-do "run" }
#include <cassert>
struct S {
S (const S&) throw ();
S (int) throw (int);
};
int main ()
{
assert (__has_nothrow_copy (S));
}

View File

@ -0,0 +1,12 @@
// { dg-do "run" }
#include <cassert>
struct S {
S (S&) throw ();
S (const S&, int) throw (int);
};
int main ()
{
assert (__has_nothrow_copy (S));
}

View File

@ -0,0 +1,13 @@
// { dg-do "run" }
// { dg-options "-std=c++0x" }
#include <cassert>
struct S {
S (const S&) throw ();
S (S&&) throw (int);
};
int main ()
{
assert (__has_nothrow_copy (S));
}