llvm-project/clang/test/SemaCXX/namespace.cpp
Douglas Gregor f9f54eab43 Make sure to properly track the anonymous namespace that lives inside
each namespace, even when the outer namespace has multiple
definitions. As part of this, collapsed two pointers worth of storage
(original namespace and inner anonymous namespace) into a single
pointer with a distinguishing bit, since the two are mutually
exclusive, saving a pointer per NamespaceDecl. Fixes PR6620.

llvm-svn: 99368
2010-03-24 00:46:35 +00:00

93 lines
1.7 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
namespace A { // expected-note 2 {{previous definition is here}}
int A;
void f() { A = 0; }
}
void f() { A = 0; } // expected-error {{unexpected namespace name 'A': expected expression}}
int A; // expected-error {{redefinition of 'A' as different kind of symbol}}
class A; // expected-error {{redefinition of 'A' as different kind of symbol}}
class B {}; // expected-note {{previous definition is here}} \
// expected-note{{candidate function (the implicit copy assignment operator)}}
void C(); // expected-note {{previous definition is here}}
namespace C {} // expected-error {{redefinition of 'C' as different kind of symbol}}
namespace D {
class D {};
}
namespace S1 {
int x;
namespace S2 {
namespace S3 {
B x;
}
}
}
namespace S1 {
void f() {
x = 0;
}
namespace S2 {
namespace S3 {
void f() {
x = 0; // expected-error {{no viable overloaded '='}}
}
}
int y;
}
}
namespace S1 {
namespace S2 {
namespace S3 {
void f3() {
y = 0;
}
}
}
}
namespace B {} // expected-error {{redefinition of 'B' as different kind of symbol}}
namespace foo {
enum x {
Y
};
}
static foo::x test1; // ok
static foo::X test2; // typo: expected-error {{no type named 'X' in}}
namespace PR6620 {
namespace numeric {
namespace op {
struct greater {};
}
namespace {
extern op::greater const greater;
}
}
namespace numeric {
namespace {
op::greater const greater = op::greater();
}
template<typename T, typename U>
int f(T& l, U& r)
{ numeric::greater(l, r); }
}
}