You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by st...@apache.org on 2012/08/31 19:35:23 UTC

svn commit: r1379520 - in /stdcxx/branches/4.3.x: src/iostore.cpp tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp

Author: steleman
Date: Fri Aug 31 17:35:23 2012
New Revision: 1379520

URL: http://svn.apache.org/viewvc?rev=1379520&view=rev
Log:
STDCXX-1058
* src/iostore.cpp (_C_copyfmt):
_C_usr->_C_iarray, _C_usr->_C_isize, _C_usr->_C_parray, _C_usr->_C_psize,
_C_usr->_C_cbarray, _C_usr->_C_cbsize set to zero after deletion.
* tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp: added regression test.

Added:
    stdcxx/branches/4.3.x/tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp   (with props)
Modified:
    stdcxx/branches/4.3.x/src/iostore.cpp

Modified: stdcxx/branches/4.3.x/src/iostore.cpp
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/src/iostore.cpp?rev=1379520&r1=1379519&r2=1379520&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/src/iostore.cpp (original)
+++ stdcxx/branches/4.3.x/src/iostore.cpp Fri Aug 31 17:35:23 2012
@@ -335,8 +335,14 @@ _C_copyfmt (const ios_base &rhs, void *d
             // delete existing arrays, if any; _C_usr will only be deleted
             // if `rhs' contains no user data (see below)
             operator delete (_C_usr->_C_iarray);
+            _C_usr->_C_iarray = 0;
+            _C_usr->_C_isize = 0;
             operator delete (_C_usr->_C_parray);
+            _C_usr->_C_parray = 0;
+            _C_usr->_C_psize = 0;
             operator delete (_C_usr->_C_cbarray);
+            _C_usr->_C_cbarray = 0;
+            _C_usr->_C_cbsize = 0;
         }
         else if (ia || pa || cba || ptie) {
             // allocation may throw

Added: stdcxx/branches/4.3.x/tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp?rev=1379520&view=auto
==============================================================================
--- stdcxx/branches/4.3.x/tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp (added)
+++ stdcxx/branches/4.3.x/tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp Fri Aug 31 17:35:23 2012
@@ -0,0 +1,101 @@
+/**************************************************************************
+ *
+ * 27.basic_ios.copyfmt.stdcxx-1058.cpp - regression test for STDCXX-1058
+ *
+ * http://issues.apache.org/jira/browse/STDCXX-1058
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ * Licensed to the Apache Software  Foundation (ASF) under one or more
+ * contributor  license agreements.  See  the NOTICE  file distributed
+ * with  this  work  for  additional information  regarding  copyright
+ * ownership.   The ASF  licenses this  file to  you under  the Apache
+ * License, Version  2.0 (the  "License"); you may  not use  this file
+ * except in  compliance with the License.   You may obtain  a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the  License is distributed on an  "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
+ * implied.   See  the License  for  the  specific language  governing
+ * permissions and limitations under the License.
+ *
+ **************************************************************************/
+/*
+ * This program should run to completion and exit with return status 0
+ */
+
+#include <ios>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define TEST_ASSERT(expr) \
+    (expr) ? ret = 0 \
+    : fprintf(stderr,"file %s line %i: Assertion failed: %s\n", \
+    __FILE__, __LINE__, #expr); fflush(stderr); if (ret != 0) abort()
+
+int x;
+
+void testfun (std::ios_base::event ev, std::ios_base& iosobj, int index)
+{
+    x = index;
+
+    switch (ev)
+    {
+        case std::ios_base::copyfmt_event:
+            (void) fprintf(stderr, "copyfmt_event\n"); break;
+        case std::ios_base::imbue_event:
+            (void) fprintf(stderr, "imbue_event\n"); break;
+        case std::ios_base::erase_event:
+            (void) fprintf(stderr, "erase_event\n"); break;
+        default:
+            (void) fprintf(stderr, "unknown (this should never happen)\n"); break;
+    }
+}
+
+
+int main ()
+{
+    struct A: std::streambuf { };
+
+    struct B: std::ios {
+        A sb;
+        B () { init (&sb); }
+    } f0, f1;
+
+    int i = 101;
+    int ret = 1;
+
+    std::ios_base::event_callback e1 = &testfun;
+    f0.register_callback (e1, i);
+
+    x = 0;
+    f0.imbue (f0.getloc());
+    TEST_ASSERT (x == i);
+
+    x = 0;
+    ret = 1;
+    f0.copyfmt (f1);
+    TEST_ASSERT (x == i);
+
+	B s0, s1;
+
+	s0.register_callback (e1, i);
+
+	x = 0;
+	ret = 1;
+	s0.imbue (f0.getloc ());
+	TEST_ASSERT (x == i);
+
+	x = 0;
+	ret = 1;
+	s0.copyfmt (s1);
+	TEST_ASSERT (x == i);
+
+    return ret;
+}
+

Propchange: stdcxx/branches/4.3.x/tests/regress/27.basic_ios.copyfmt.stdcxx-1058.cpp
------------------------------------------------------------------------------
    svn:eol-style = native