if (isa<ObjCMethodDecl>(this))
return false;
+ // FIXME: Is this correct if one of the decls comes from an inline namespace?
if (isa<ObjCInterfaceDecl>(this) && isa<ObjCCompatibleAliasDecl>(OldD))
return true;
// A typedef of an Objective-C class type can replace an Objective-C class
// declaration or definition, and vice versa.
+ // FIXME: Is this correct if one of the decls comes from an inline namespace?
if ((isa<TypedefNameDecl>(this) && isa<ObjCInterfaceDecl>(OldD)) ||
(isa<ObjCInterfaceDecl>(this) && isa<TypedefNameDecl>(OldD)))
return true;
-
+
// For non-function declarations, if the declarations are of the
- // same kind then this must be a redeclaration, or semantic analysis
- // would not have given us the new declaration.
- return this->getKind() == OldD->getKind();
+ // same kind and have the same parent then this must be a redeclaration,
+ // or semantic analysis would not have given us the new declaration.
+ // Note that inline namespaces can give us two declarations with the same
+ // name and kind in the same scope but different contexts.
+ return this->getKind() == OldD->getKind() &&
+ this->getDeclContext()->getRedeclContext()->Equals(
+ OldD->getDeclContext()->getRedeclContext());
}
bool NamedDecl::hasLinkage() const {
Numbers2::f(f);
Numbers2::g(f); // expected-error {{no viable conversion from 'float' to 'Numbers::Number'}}
}
+
+namespace inline_ns {
+ int x; // expected-note 2{{found}}
+ inline namespace A { // expected-warning {{C++11}}
+ int x; // expected-note 2{{found}}
+ int y; // expected-note 2{{found}}
+ }
+ int y; // expected-note 2{{found}}
+ int k1 = x + y; // expected-error 2{{ambiguous}}
+ int k2 = inline_ns::x + inline_ns::y; // expected-error 2{{ambiguous}}
+}
inline namespace M {
void f(); // expected-note {{possible target}}
void g();
- extern int m, n;
- struct S; struct T;
- enum E : int; enum F : int;
+ extern int m; // expected-note {{candidate}}
+ extern int n;
+ struct S; // expected-note {{candidate}}
+ struct T;
+ enum E : int; // expected-note {{candidate}}
+ enum F : int;
template<typename T> void ft(); // expected-note {{here}}
template<typename T> void gt(); // expected-note {{here}}
template<typename T> extern int mt; // expected-note {{here}} expected-warning {{extension}}
// When named by unqualified-id, we do *not* look in the inline namespace
// set.
void f() {} // expected-note {{possible target}}
- int m;
- struct S {};
- enum E : int {};
+ int m; // expected-note {{candidate}}
+ struct S {}; // expected-note {{candidate}}
+ enum E : int {}; // expected-note {{candidate}}
static_assert(&f != &M::f, ""); // expected-error {{reference to overloaded function could not be resolved}}
- static_assert(&m != &M::m, "");
- typedef S X; // expected-note {{previous}}
- typedef M::S X; // expected-error {{different type}}
- typedef E Y; // expected-note {{previous}}
- typedef M::E Y; // expected-error {{different type}}
+ static_assert(&m != &M::m, ""); // expected-error {{ambiguous}}
+ typedef S X; // expected-error {{ambiguous}}
+ typedef E Y; // expected-error {{ambiguous}}
// When named by (unqualified) template-id, we do look in the inline
// namespace set. See [namespace.def]p8, [temp.explicit]p3,