You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by "Farid Zaripov (JIRA)" <ji...@apache.org> on 2007/09/14 11:26:32 UTC

[jira] Updated: (STDCXX-556) [MSVC 7.1] Bug in implementation of the empty base optimization

     [ https://issues.apache.org/jira/browse/STDCXX-556?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Farid Zaripov updated STDCXX-556:
---------------------------------

    Environment: 
MSVC 7.1 with Service Pack 1

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

  was:MSVC 7.1

        Summary: [MSVC 7.1] Bug in implementation of the empty base optimization  (was: Bug in MSVC 7.1 implementation of the empty base optimization)

> [MSVC 7.1] Bug in implementation of the empty base optimization
> ---------------------------------------------------------------
>
>                 Key: STDCXX-556
>                 URL: https://issues.apache.org/jira/browse/STDCXX-556
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: External
>         Environment: MSVC 7.1 with Service Pack 1
> Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
> Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
>            Reporter: Farid Zaripov
>
> The test below exit with exitcode 1 due to bug in MSVC 7.1 implementation of the empty base optimization.
> -----------------------------
> #include <cstring>
> #include <cstdio>
> #include <new>
> class empty_base { };
> class base
> {
> public:
>     base (int val) : __val (val) { }
>     volatile int __val;
> };
> class derived1 : public base, public empty_base
> {
> public:
>     derived1 (int val) : base (val), empty_base () { }
> };
> class derived2 : public base, public empty_base
> {
> public:
>     derived2 (int val) : base (val) { }
> };
> template <class T>
> int foo (const int val, const char* name)
> {
>     const char fill = '\xdc';
>     char buf [sizeof (T) + 1];
>     std::memset (buf, fill, sizeof (buf));
>     T* t = new (buf) T (val);
>     int ret = 0;
>     if (fill != buf [sizeof (T)]) {
>         ++ret;
>         std::printf ("buf [sizeof (%s)] expected %d, got %d\n",
>                      name, int (fill), int (buf [sizeof (T)]));
>     }
>     if (val != t->__val) {
>         ++ret;
>         std::printf ("%s::__val expected %d, got %d\n",
>                      name, val, t->__val);
>     }
>     t->~T ();
>     return ret;
> }
> int main(int, char**)
> {
>     const int init = 0xcdcdcdcd;
>     return   foo <derived1> (init, "derived1")
>            + foo <derived2> (init, "derived2");
> }
> -----------------------------
> The test output:
> -----------------------------
> buf [sizeof (derived1)] expected -36, got 0
> -----------------------------

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.