Re: [Bug c++/31187] New: [4.2 regression] extern declaration of variable in anonymous namespace prevents use of its address as template argument

2007-03-16 Thread Gabriel Dos Reis
zak at transversal dot com [EMAIL PROTECTED] writes:

| The following code, which compiles fine on gcc 4.1.2 and I believe is valid,
| fails on an up-to-date checkout from the 4.2 branch:
| 
| --
| class foo { };
| 
| namespace
| {
| extern foo foo1;
| foo foo1;
| }
| 
| template foo * 
| class bar { };
| 
| bar foo1  bar1;
| ---
| 
| giving the error:
| 
| test.cc:12: error: 'unnamed::foo1' is not a valid template argument of type
| 'foo*' because 'unnamed::foo1' does not have external linkage
| test.cc:12: error: invalid type in declaration before ';' token
| 
| 
| ... which I would only expect if foo1 were declared static.

Yes, this is a bug in the compiler.  I suspect it was introduced when
the the back was told to treat declarations at unnamed namespaces
ast static.  That of course is an optimization and should be appear at
the front-end.

-- gaby


[Bug c++/31187] New: [4.2 regression] extern declaration of variable in anonymous namespace prevents use of its address as template argument

2007-03-15 Thread zak at transversal dot com
The following code, which compiles fine on gcc 4.1.2 and I believe is valid,
fails on an up-to-date checkout from the 4.2 branch:

--
class foo { };

namespace
{
extern foo foo1;
foo foo1;
}

template foo * 
class bar { };

bar foo1  bar1;
---

giving the error:

test.cc:12: error: 'unnamed::foo1' is not a valid template argument of type
'foo*' because 'unnamed::foo1' does not have external linkage
test.cc:12: error: invalid type in declaration before ';' token


... which I would only expect if foo1 were declared static.


If I remove the line with the extern declaration, the code compiles again on
4.2.


-- 
   Summary: [4.2 regression] extern declaration of variable in
anonymous namespace prevents use of its address as
template argument
   Product: gcc
   Version: 4.2.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: zak at transversal dot com
 GCC build triplet: x86_64-pc-linux-gnu
  GCC host triplet: x86_64-pc-linux-gnu
GCC target triplet: x86_64-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31187