[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
Title: | Alpha Developer Support |
Notice: | [email protected], 800-332-4786 |
Moderator: | HYDRA::SYSTEM |
|
Created: | Mon Jun 06 1994 |
Last Modified: | Fri Jun 06 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 3722 |
Total number of notes: | 11359 |
3400.0. "Cogit Corporation" by HYDRA::LNARAYAN () Tue Mar 25 1997 19:52
Company Name : Cogit Corporation
Contact Name : John Wood
Phone : 415.908.1910
Fax :
Email : [email protected]
Date/Time in : 25-MAR-1997 19:51:39
Entered by : L. Narayan
SPE center : MRO
Category : UNIX
OS Version : V4.0B
System H/W : 8400 5/350
Brief Description of Problem:
-----------------------------
From: SMTP%"[email protected]" 25-MAR-1997 12:27:04.31
To: [email protected]
CC: [email protected]
Subj: porting/C++ problems
Return-Path: [email protected]
Received: by asimov.mro.dec.com (UCX V4.1-12, OpenVMS V6.2 VAX);
Tue, 25 Mar 1997 12:27:02 -0500
Received: from pobox1.pa.dec.com by fluid.mro.dec.com (5.65v4.0/1.1.8.2/19Nov96-0448PM)
id AA07667; Tue, 25 Mar 1997 12:27:15 -0500
Received: by pobox1.pa.dec.com; id AA16622; Tue, 25 Mar 97 09:27:15 -0800
Received: from ns.pilot.net by mail1.digital.com (5.65 EXP 4/12/95 for V3.2/1.0/WV)
id AA27303; Tue, 25 Mar 1997 09:22:49 -0800
Received: from cogit.com (unknown-79-101.ergosum.com [206.189.79.101]) by mail.pilot.net with SMTP id JAA09905 for <[email protected]>; Tue, 25 Mar 1997 09:22:49 -0800 (PST)
Received: from reficio.cogit.com by cogit.com (SMI-8.6/SMI-SVR4)
id JAA07815; Tue, 25 Mar 1997 09:22:33 -0800
From: [email protected] (John Wood)
Received: by reficio.cogit.com (SMI-8.6/client-1.3)
id JAA11809; Tue, 25 Mar 1997 09:22:32 -0800
Date: Tue, 25 Mar 1997 09:22:32 -0800
Message-Id: <[email protected]>
To: [email protected]
Subject: porting/C++ problems
Cc: [email protected]
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Md5: HihH6G3WKJD13LiRYtpA5g==
I'm not sure that this is the proper channel for these issues; if it's not, please let me know and I will forward the following to the Customer Support Center. We are
using C++ 5.5 and Digital UNIX 4.0b on a 8400 5/350.
Cogit Corp customer id: 951755
Program account code: 210970
Digital C++ Bugs and Peculiarities
=====================================
BUGS
----
1) Compiler may optimize-out side effects of a statement when a
templatized type has an empty destructor!!
EXAMPLE from List<T>
while (size) { // destroy each element of the array
array[--size].~T();
}
Produces an infinite loop if T is int:
WORKAROUND:
Make templatized destructor call side-effect free:
while (size) { // destroy each element of the array
--size;
array[size].~T();
}
2) templates parameter names must match exactly
EXAMPLE:
template <class KEY, class VALUE>
class Hash {
public:
Hash( const KEY& k, const VALUE& v);
};
template <class K, class V>
Hash<K,V>::Hash( const K& k, const V& v) {
}
averto.cogit.com:185% cxx Temp.cc
cxx: Error: Temp.cc, line 8: Missing ")".
Hash<K,V>::Hash( const K& k, const V& v) {
------------------------^
Changing "KEY" to "K" solves the problem.
WORKAROUND:
Use consistent names for template parameters everywhere.
3) Inheritance of certain functions doesn't seem to work. (this
needs furtheer characterization!)
EXAMPLE:
#include <stdio.h>
#include <assert.h>
struct foo {
foo(int y) : x(y) {};
int x;
};
class FooPtr_Base {
public:
#ifdef BUG
int operator!() const { return p == 0; }
#endif
~FooPtr_Base() { printf( "destructor called\n"); delete p; }
FooPtr_Base() : p(0) {}
foo* p;
};
class FooPtr : public FooPtr_Base {
public:
#ifndef BUG
int operator!() const { return p == 0; }
#endif
FooPtr(foo* pf) {
p = pf;
}
FooPtr(const FooPtr& src){
p = src.p;
printf("copy constructor called\n");
(foo* &)src.p = 0;
}
};
extern FooPtr f( FooPtr b );
int main (int , char **argv) {
FooPtr l5(new foo(2));
FooPtr q( f(l5 ));
assert(!l5);
return 0;
}
averto.cogit.com:886% sh -x inhb
+ cxx -UBUG -w0 -g -nocleanup -O0 -inline none InheritanceBug.cc -o InheritanceBug
+ InheritanceBug
copy constructor called
destructor called
destructor called
destructor called
+ cxx -DBUG -w0 -g -nocleanup -O0 -inline none InheritanceBug.cc -o InheritanceBug
+ InheritanceBug
Assertion failed: !l5, file InheritanceBug.cc, line 45
WORKAROUND:
In this case, moving operator= down a level solves the problem.
Unfortunately, we don't know why this happens, so the cure is
magic and may not be a general remedy. The above example was
derived from SafePtr<T> (tSafePtr originally demonstrated the
problem).
4) -O0 doesn't seem to turn off all optimzation.
EXAMPLE:
#include <stdio.h>
#include <assert.h>
class XXXX {
public:
XXXX() { x = 0; }
XXXX( const XXXX& );
XXXX& operator = (const XXXX&);
int x;
};
inline
XXXX::XXXX( const XXXX& y) {
printf("Copy called\n");
x = y.x+1;
}
inline
XXXX& XXXX::operator=( const XXXX& y) {
printf("Assignment called\n");
x = y.x;
return *this;
}
XXXX f ( XXXX a, XXXX b, XXXX c) {
b = c;
a = b;
return a;
}
int main() {
XXXX x1, x2, x3;
XXXX y = f(x1,x2,x3) ;
assert(x1.x == 0);
assert(x2.x == 0);
// assert(x3.x == 0);
return y.x - 2;
}
The copy constructor/destructor calls for x3 are optimized out even
when -O0 is on the command line. This lead us down a wild goose chase
looking for bug #3.
WORKAROUND:
?????
5) templates must be in header files, along with any classes or
definitions that template relies on.
EXAMPLE:
template <class T>
class XXX {
public:
static XXX<T> * & root();
};
template <class T> XXX<T> * &
XXX<T>::root()
{
static XXX<T> *the_root = 0;
return( the_root );
}
int
main()
{
XXX<int>** y = &XXX<int>::root();
assert( &XXX<int>::root() == y );
assert( (void *)&XXX<double>::root() != (void *)y );
}
Does not link:
cxx -g3 -nocleanup -L../lib -L/proj/cogit/build/mainline/digital-gnu/\
lib -o t-platform t-platform.o
cxx: Error: ./cxx_repository/XXX__Td.cxx, line 4: Invalid declaration.
typedef XXX<double > __dummy_;
-----------^
cxx: Error: ./cxx_repository/XXX__Ti.cxx, line 4: Invalid declaration.
typedef XXX<int > __dummy_;
-----------^
ld:
Unresolved:
XXX<int>::root(void)
XXX<double>::root(void)
make: *** [t-platform] Error 1
Moving the template declarations into a header solves the problem.
WORKAROUND:
All template class (and function?) definitions must be in headers.
Or use some unfortunate combination of options (like
-tlocal).
==========================
Again, please let me know if these issues are not appropriate to send to alpha-developer and I will send them
elsewhere.
I appreciate your attention to these matters and welcome any solutions you may be able to provide.
John Wood
Manager, Discovery Center Operations
Cogit Corporation
415.908.1910
T.R | Title | User | Personal Name | Date | Lines |
---|
3400.1 | expecting example code | HYDRA::LNARAYAN | | Mon Apr 14 1997 14:04 | 109 |
| From: HYDRA::LNARAYAN "R Lakshminarayan, Software Partner Engg" 14-APR-1997 12:57:03.27
To: US4RMC::"[email protected]"
CC: LNARAYAN
Subj: porting/C++ problems
John Wood
Thanks for contacting Alpha developer support. As you said this is the
right place to report Partner porting issues. I have few answers, But
need example code. Our C++ team wants to know whether you would be
interested in becoming field test site to field test C++ Version 6.0?
(starting this summer) Please note that the reference number for this
call is #3400 dated 25-MAR-1997 and quote this number when communicating
wrt to this call.
Thank You
-Nari
Alpha Developer Support
Answers from our C++ group for your questions:
item 1)
> while (size) { // destroy each element of the array
> array[--size].~T();
> }
>
> Produces an infinite loop if T is int:
If the size is a negative number, then it shall run into loop.
However, you also mentioned that the following workaround:
> while (size) { // destroy each element of the array
> --size;
> array[size].~T();
> }
It more likely a bug somewhere then.
We would like to look into this case, please provide us a small test that
could demonstrate this loop problem.
--------------------------------------------------------------------------------
>2) templates parameter names must match exactly
The workaround is as stated. This is fixed in V6.0.
--------------------------------------------------------------------------------
item 3)
>+ cxx -DBUG -w0 -g -nocleanup -O0 -inline none InheritanceBug.cc -o
>InheritanceBug
>+ InheritanceBug
>Assertion failed: !l5, file InheritanceBug.cc, line 45
>
>
> WORKAROUND:
> In this case, moving operator= down a level solves the problem.
> Unfortunately, we don't know why this happens, so the cure is
> magic and may not be a general remedy. The above example was
> derived from SafePtr<T> (tSafePtr originally demonstrated the
> problem).
I could not reproduce the same problem from your source posted at item 3)
on both compiler:
DEC C++ V5.5-004 on Digital UNIX (Alpha)
DEC CXX X5.6-130 on Digital UNIX (Alpha)
shijun.zko.dec.com> cxx -DBUG -w0 -g -nocleanup -O0 -inline none cpp3531c.cxx
ld:
Unresolved:
f(FooPtr)
shijun.zko.dec.com> $CEXE/deccxx_driver -DBUG -w0 -g -nocleanup -O0 -inline none
cpp3531c.cxx
ld:
Unresolved:
f(FooPtr)
After I provided the definition to the "f(FooPtr)" as {return b;},
the code ran fine from both compilers.
shijun.zko.dec.com> a.out
copy constructor called
copy constructor called
destructor called
destructor called
destructor called
Please provide us a test that can show this problem.
--------------------------------------------------------------------------------
>4) -O0 doesn't seem to turn off all optimzation.
>
> The copy constructor/destructor calls for x3 are optimized out even
> when -O0 is on the command line. This lead us down a wild goose chase
> looking for bug #3.
This was done to provide a consistent semantic meaning with and without
optimization. I've noted a suggestion to provide a way to disable
optimization of copy ctor/dtor calls.
--------------------------------------------------------------------------------
>5) templates must be in header files, along with any classes or
> definitions that template relies on.
>
The workaround is as stated. Yes, this is a documented restriction of the
automatic instantiation implementation for V5.n. We plan to lift this
restriction in V6.0.
--------------------------------------------------------------------------------
|
3400.2 | example code... | HYDRA::LNARAYAN | | Mon Apr 14 1997 18:38 | 158 |
| From: US6RMC::"[email protected]" "John Wood" 14-APR-1997 17:05:04.43
To: hydra::lnarayan
CC:
Subj: porting/C++ problems/ call #3400
reference call #3400 dated 25 MAR 1997
>
> > while (size) { // destroy each element of the array
> > array[--size].~T();
> > }
> >
> > Produces an infinite loop if T is int:
>
> If the size is a negative number, then it shall run into loop.
Obviously, but size is not a negative number. This code works on all
other compilers we use.
> please provide us a small test that could demonstrate
> this loop problem.
Happy to:
#include <stdio.h>
#include <new.h>
#include <assert.h>
template <class T>
class List {
int max_size;
int size;
T *array;
public:
int length() { return( size ); }
T &elem( int i ) { assert( i < size ); return( array[i] ); }
void *operator new( size_t, void *place ) { return( place ); }
void append( const T &x ) {
assert( size < max_size );
new (& array[size]) T( x );
++size;
}
List() : max_size( 8 ), size( 0 ) {
array = (T *) new char[sizeof( T ) * max_size];
}
~List() {
while( size > 0 )
array[--size].~T();
}
};
int
main()
{
printf( "List start\n" );
{
List<int> li;
int i;
for( i = 0; i < 4; ++i )
li.append( i * i );
for( i = 0; i < 4; ++i )
printf( "%d => %d\n", i, li.elem( i ) );
}
printf( "List end\n" );
}
> item 3)
>
> >+ cxx -DBUG -w0 -g -nocleanup -O0 -inline none InheritanceBug.cc -o
> After I provided the definition to the "f(FooPtr)" as {return b;},
> the code ran fine from both compilers.
Try: { return new foo(0); }
#include <stdio.h>
#include <assert.h>
struct foo {
foo(int y) : x(y) {};
int x;
};
class FooPtr_Base {
public:
#ifdef BUG
int operator!() const { return p == 0; }
#endif
~FooPtr_Base() { printf( "destructor called\n"); delete p; }
FooPtr_Base() : p(0) {}
foo* p;
};
class FooPtr : public FooPtr_Base {
public:
#ifndef BUG
int operator!() const { return p == 0; }
#endif
FooPtr(foo* pf) {
p = pf;
}
FooPtr(const FooPtr& src){
p = src.p;
printf("copy constructor called\n");
(foo* &)src.p = 0;
}
};
extern FooPtr f( FooPtr b );
int main (int , char **argv) {
FooPtr l5(new foo(2));
FooPtr q( f(l5 ));
assert(!l5);
return 0;
}
FooPtr
f( FooPtr b )
{
return new foo(0);
}
___
Regards,
John Wood
% ====== Internet headers and postmarks (see DECWRL::GATEWAY.DOC) ======
% Received: from mail13.digital.com by us6rmc.mro.dec.com (5.65/rmc-17Jan97) id AA00611; Mon, 14 Apr 97 16:58:52 -0400
% Received: from mail-oak-1.pilot.net by mail13.digital.com (8.7.5/UNX 1.5/1.0/WV) id QAA02058; Mon, 14 Apr 1997 16:54:02 -0400 (EDT)
% Received: from cogit.com (unknown-79-101.ergosum.com [206.189.79.101]) by mail-oak-1.pilot.net with SMTP id NAA18068 for <[email protected]>; Mon, 14 Apr 1997 13:48:22 -0700 (PDT)
% Received: from reficio.cogit.com by cogit.com (SMI-8.6/SMI-SVR4) id MAA20059; Mon, 14 Apr 1997 12:34:49 -0700
% From: [email protected] (John Wood)
% Received: by reficio.cogit.com (SMI-8.6/client-1.3) id MAA01431; Mon, 14 Apr 1997 12:36:09 -0700
% Date: Mon, 14 Apr 1997 12:36:09 -0700
% Message-Id: <[email protected]>
% Subject: porting/C++ problems/ call #3400
% To: hydra::lnarayan
% Mime-Version: 1.0
% Content-Type: text/plain; charset=us-ascii
% Content-Transfer-Encoding: 7bit
% Content-Md5: jn08D0IzBZwSyURbuaw+Xw==
|
3400.3 | this is a bug | HYDRA::LNARAYAN | | Tue Apr 15 1997 11:47 | 2 |
| The problem reported in the previous mail is a bug and C++ notes conf
confirms this. see note 3531 in c++ for more info.
|
3400.4 | closed | HYDRA::LNARAYAN | | Tue Apr 15 1997 12:03 | 26 |
| From: DECC::KAO "Shi-Jung Kao 15-Apr-1997 1058 -0500" 15-APR-1997 11:00:32.72
To: HYDRA::LNARAYAN
CC:
Subj: Item 3 has been fixed in V5.6 C++ field test release, and will be available soon.
<<< TURRIS::DISK$NOTES_PACK:[NOTES$LIBRARY]C_PLUS_PLUS.NOTE;2 >>>
-< C++ >-
================================================================================
Note 3531.7 C++ questions... 7 of 7
DECC::KAO 12 lines 15-APR-1997 10:58
-< Problem item 3 has been fixed... >-
--------------------------------------------------------------------------------
Thanks for your tests.
Since August already noted the problem into the bug tracking system,
I just want to clarify the following:
Your workaround on item 1, the loop problem is correct.
Item 3:
>Assertion failed: !l5, file InheritanceBug.cc, line 45
This problem has been fixed in our next release of DEC C++ V5.6
compiler. Its field test release for UNIX will be available in a week or so.
|