From 7a59efae86cfa74ed45a0a78139082e8443873b1 Mon Sep 17 00:00:00 2001
From: Paolo Carlini open
clear the error flags.
+ fs.clear()
between the calls to close() and open(),
and then everything will work like we all expect it to work.
+ Update: for GCC 4.0 we implemented the resolution
+ of DR #409 and open() now calls
+ clear()
on success!
rel_ops
Another is the rel_ops
namespace and the template
diff --git a/libstdc++-v3/include/std/std_fstream.h b/libstdc++-v3/include/std/std_fstream.h
index ed119d4c8ea..fb042ae2fec 100644
--- a/libstdc++-v3/include/std/std_fstream.h
+++ b/libstdc++-v3/include/std/std_fstream.h
@@ -496,6 +496,10 @@ namespace std
{
if (!_M_filebuf.open(__s, __mode | ios_base::in))
this->setstate(ios_base::failbit);
+ else
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 409. Closing an fstream should clear error state
+ this->clear();
}
/**
@@ -623,6 +627,10 @@ namespace std
{
if (!_M_filebuf.open(__s, __mode | ios_base::out))
this->setstate(ios_base::failbit);
+ else
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 409. Closing an fstream should clear error state
+ this->clear();
}
/**
@@ -749,6 +757,10 @@ namespace std
{
if (!_M_filebuf.open(__s, __mode))
this->setstate(ios_base::failbit);
+ else
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 409. Closing an fstream should clear error state
+ this->clear();
}
/**
diff --git a/libstdc++-v3/testsuite/27_io/basic_ifstream/open/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ifstream/open/char/1.cc
index dcb89a6dfa2..cbc4c7ac109 100644
--- a/libstdc++-v3/testsuite/27_io/basic_ifstream/open/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_ifstream/open/char/1.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -40,9 +40,10 @@ void test01()
ifs1.open(name_01);
VERIFY( ifs1.is_open() );
- // fail bit still true
- VERIFY( !(ifs1) );
- VERIFY( ifs1.rdstate() == std::ios_base::failbit );
+
+ // As per the resolution of DR 409.
+ VERIFY( (ifs1) );
+ VERIFY( ifs1.rdstate() == std::ios_base::goodbit );
ifs1.close();
}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ofstream/open/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ofstream/open/char/1.cc
index 5bb02d4eb3c..64b9e342c38 100644
--- a/libstdc++-v3/testsuite/27_io/basic_ofstream/open/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_ofstream/open/char/1.cc
@@ -1,4 +1,4 @@
-// Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -41,9 +41,10 @@ void test01()
ofs1.open(name_02);
VERIFY( ofs1.is_open() );
- // fail bit still true
- VERIFY( !(ofs1) );
- VERIFY( ofs1.rdstate() == std::ios_base::failbit );
+
+ // As per the resolution of DR 409.
+ VERIFY( (ofs1) );
+ VERIFY( ofs1.rdstate() == std::ios_base::goodbit );
ofs1.close();
}