minar@reed.bitnet (Nelson Minar,L08,x640,7776519) (10/22/90)
I have encountered something extemely nondesirable about how Turbo C++
1.0 handles inline functions returning class instances. It seems to get
very confused about them, and won't compile conditionals complaining
about required destructors (explicitly declaring a destructor is no
help). g++ 1.37.1 has no trouble at all compiling this same piece of
code.
Here is the error output of tcc:
inlines.cpp:
Error inlines.cpp 13: Destructor for Foo required in conditional expression
in function test(int)
Error inlines.cpp 13: Destructor for Foo required in conditional expression
in function test(int)
and here is the program:
// This compiles under g++ 1.37.1, but will not compile in Turbo C++ 1.0
// with the compilation options '-y -v -vi- -N' or '-y -v -vi -N'
#include <stdio.h>
class Foo {
public:
Foo() {} // plain constructor
Foo(int x) { value = x; } // constructor taking an int
operator int() { return value; } // conversion
int value;
};
inline Foo
test (int input) {
return input == 1 ? Foo (4) : Foo (3); // line 13 - return a Foo
} // depending on input
void main() {
Foo testVal;
testVal = test(0); // testVal should be Foo(3)
printf ("%d", int(testVal)); // g++ gives expected answer
}
Even weirder, this program will compile fine without inlining functions
('-vi-') but will give the same "Destructor required" errors when
compiled with inlining functions ('-vi'), IF the conditional expression
return input == 1 ? Foo (4) : Foo (3);
is turned into the equivalent if-then construct:
if (input == 1)
return Foo(4);
else
return Foo(3);
Not very useful, as I still can't inline the function.
it will also compile ok if there are not multiple return points in the
inlined function, say
return Foo(input);
Is this a bug, is it me being stupid about trying to learn C++, or just
another 'interpretation' of the C++ 2.0 standard like Borland's for loop
thing is? Its excessively annoying, as the function I am trying to
inline really needs to be inlined. I think I'll have to switch to a
macro, or some ugly function-with-side-effect answer.
I haven't tried to get to tech support yet, partially because their tech
support is a real pain, and partially because I do not know how to get
Borland a copy of the source code. Is there ANY address on the Net that
will get to a Borland tech? I don't care if I have to wait for a snail-
mail reply...
__
\/ minar@reed.bitnet You know in your heart its flat.