* Re: Why is this code accepted?
@ 2001-04-16 14:58 Mike Stump
2001-04-16 20:16 ` Alexandre Oliva
0 siblings, 1 reply; 7+ messages in thread
From: Mike Stump @ 2001-04-16 14:58 UTC (permalink / raw)
To: gcc, nbecker
> To: gcc@gcc.gnu.org
> From: nbecker@fred.net
> Date: 16 Apr 2001 16:27:42 -0400
> This code compiles without complaint both on gcc-2.96 and on a
> recent gcc-3 snapshot, but doesn't link. I suspect the
> initialization of the static "a" is invalid (I don't have a good
> reference handy), but isn't gcc behaviour wrong?
There was a g++ feature that allowed this to work, a while ago.
Someone broke that feature, and didn't remove the feature from all
places in the compiler that supported the feature. As I recall, the
standard doesn't support this feature.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why is this code accepted?
2001-04-16 14:58 Why is this code accepted? Mike Stump
@ 2001-04-16 20:16 ` Alexandre Oliva
2001-04-17 4:57 ` nbecker
0 siblings, 1 reply; 7+ messages in thread
From: Alexandre Oliva @ 2001-04-16 20:16 UTC (permalink / raw)
To: Mike Stump; +Cc: gcc, nbecker
On Apr 16, 2001, Mike Stump <mrs@windriver.com> wrote:
>> To: gcc@gcc.gnu.org
>> From: nbecker@fred.net
>> Date: 16 Apr 2001 16:27:42 -0400
>> This code compiles without complaint both on gcc-2.96 and on a
>> recent gcc-3 snapshot, but doesn't link. I suspect the
>> initialization of the static "a" is invalid (I don't have a good
>> reference handy), but isn't gcc behaviour wrong?
> There was a g++ feature that allowed this to work, a while ago.
> Someone broke that feature, and didn't remove the feature from all
> places in the compiler that supported the feature. As I recall, the
> standard doesn't support this feature.
Anyway, even in the few cases in which it does allow a static const
data member to be initialized inside the class body, it still requires
the data member to be defined outside the class body, which would
probably have got you around the problem.
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist *Please* write to mailing lists, not to me
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why is this code accepted?
2001-04-16 20:16 ` Alexandre Oliva
@ 2001-04-17 4:57 ` nbecker
2001-04-17 14:52 ` Alexandre Oliva
0 siblings, 1 reply; 7+ messages in thread
From: nbecker @ 2001-04-17 4:57 UTC (permalink / raw)
To: Alexandre Oliva; +Cc: Mike Stump, gcc
If it doesn't work shouldn't gcc reject it?
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why is this code accepted?
2001-04-17 4:57 ` nbecker
@ 2001-04-17 14:52 ` Alexandre Oliva
0 siblings, 0 replies; 7+ messages in thread
From: Alexandre Oliva @ 2001-04-17 14:52 UTC (permalink / raw)
To: nbecker; +Cc: Mike Stump, gcc
On Apr 17, 2001, nbecker@fred.net wrote:
> If it doesn't work shouldn't gcc reject it?
Nope. How would GCC tell that the static data member isn't going to
be defined in another translation unit? That's why this rule doesn't
require a diagnostic from the compiler.
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist *Please* write to mailing lists, not to me
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why is this code accepted?
@ 2001-04-17 19:41 Mike Stump
0 siblings, 0 replies; 7+ messages in thread
From: Mike Stump @ 2001-04-17 19:41 UTC (permalink / raw)
To: aoliva, nbecker; +Cc: gcc
> Cc: Mike Stump <mrs@windriver.com>, gcc@gcc.gnu.org
> From: Alexandre Oliva <aoliva@redhat.com>
> Date: 17 Apr 2001 18:51:45 -0300
> On Apr 17, 2001, nbecker@fred.net wrote:
> > If it doesn't work shouldn't gcc reject it?
Oh, wait, I know what's wrong...
g++ -pedantic-errors -ansi -S t.cc
t.cc:13: ISO C++ forbids initialization of member constant `a' of non-integral
type `const double[]'
It works as designed, and if we add:
const double X::a[2];
to the program to meet the logical requirements of the extension, and
don't ask for the error, then it works as expected. I was thinking
of a language without the clause:
4 If a static data member is of const integral or const enumeration
type, its declaration in the class definition can specify a
constant-initializer which shall be an integral constant expression
(5.19). In that case, the member can appear in integral constant
expressions within its scope. The member shall still be defined in a |
namespace scope if it is used in the program and the namespace scope |
definition shall not contain an initializer.
in it, sorry for the confusion. This wording first appeared in the 95
(95-0029) version of the working paper, so it is new... :-)
So, no, no extension was broken, and no, no bug is present.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Why is this code accepted?
@ 2001-04-17 17:20 Mike Stump
0 siblings, 0 replies; 7+ messages in thread
From: Mike Stump @ 2001-04-17 17:20 UTC (permalink / raw)
To: aoliva, nbecker; +Cc: gcc
> To: Alexandre Oliva <aoliva@redhat.com>
> Cc: Mike Stump <mrs@windriver.com>, gcc@gcc.gnu.org
> From: nbecker@fred.net
> Date: 17 Apr 2001 07:56:56 -0400
> If it doesn't work shouldn't gcc reject it?
Yes, like I said, I believe that the standard mandates that a
diagnostic is produced for that code.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Why is this code accepted?
@ 2001-04-16 13:27 nbecker
0 siblings, 0 replies; 7+ messages in thread
From: nbecker @ 2001-04-16 13:27 UTC (permalink / raw)
To: gcc
This code compiles without complaint both on gcc-2.96 and on a recent gcc-3 snapshot,
but doesn't link. I suspect the initialization of the static "a" is
invalid (I don't have a good reference handy), but isn't gcc behaviour
wrong? If the initialization is invalid, why doesn't the compiler
complain (it doesn't even with -Wall)? If not, why doesn't it link?
--------------------
cd /home/nbecker/bitexact/bitexact/
/opt/gcc/bin/g++ -o bug bug.cc
/tmp/ccZtF0aa.o: In function `X::X() ':
/tmp/ccZtF0aa.o(.gnu.linkonce.t._ZN1XC1Ev+0xa): undefined reference to `X::a '
/tmp/ccZtF0aa.o(.gnu.linkonce.t._ZN1XC1Ev+0xf): undefined reference to `X::a '
collect2: ld returned 1 exit status
--------------------
#include <vector>
using namespace std;
class Y {
vector<double> c;
public:
Y (const double* a, const double* b) :
c (a, b)
{}
};
class X {
static const double a[] = {1, 2};
Y y;
public:
X () :
y (&a[0], &a[2])
{}
};
main () {
vector<X> x (2);
}
-------------------
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2001-04-17 19:41 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-04-16 14:58 Why is this code accepted? Mike Stump
2001-04-16 20:16 ` Alexandre Oliva
2001-04-17 4:57 ` nbecker
2001-04-17 14:52 ` Alexandre Oliva
-- strict thread matches above, loose matches on Subject: below --
2001-04-17 19:41 Mike Stump
2001-04-17 17:20 Mike Stump
2001-04-16 13:27 nbecker
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).