DeclContext::lookup_const_iterator I, E;\r
for (llvm::tie(I, E) = LookupCtx->lookup(Context, Name); I != E; ++I) {\r
IdIsUndeclared = false;\r
- if (((*I)->getIdentifierNamespace() & Decl::IDNS_Tag) && \r
- !isa<EnumDecl>(*I))\r
+ if (((*I)->getIdentifierNamespace() & Decl::IDNS_Tag) || \r
+ isa<TypedefDecl>(*I))\r
return *I;\r
}\r
\r
// not a class-name or namespace-name, the program is ill-formed.\r
\r
for (; I != E; ++I) {\r
- if (TypedefDecl *TD = dyn_cast<TypedefDecl>(*I)) {\r
- if (TD->getUnderlyingType()->isRecordType())\r
- break;\r
- continue;\r
+ if (isa<TypedefDecl>(*I)) {\r
+ break;\r
}\r
- if (((*I)->getIdentifierNamespace()&Decl::IDNS_Tag) && !isa<EnumDecl>(*I))\r
+ if (((*I)->getIdentifierNamespace() & Decl::IDNS_Tag))\r
break; \r
}\r
\r
\r
if (SD) {\r
if (TypedefDecl *TD = dyn_cast<TypedefDecl>(SD)) {\r
- assert(TD->getUnderlyingType()->isRecordType() &&"Invalid Scope Decl!");\r
- SD = TD->getUnderlyingType()->getAsRecordType()->getDecl();\r
+ if (const RecordType* Record = TD->getUnderlyingType()->getAsRecordType())\r
+ return cast<DeclContext>(Record->getDecl());\r
+ } else if (isa<NamespaceDecl>(SD) || isa<RecordDecl>(SD)) {\r
+ return cast<DeclContext>(SD);\r
}\r
\r
- assert((isa<NamespaceDecl>(SD) || isa<RecordDecl>(SD)) &&\r
- "Invalid Scope Decl!");\r
- return cast<DeclContext>(SD);\r
+ // Fall through to produce an error: we found something that isn't\r
+ // a class or a namespace.\r
}\r
\r
unsigned DiagID;\r
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify -std=c++98 %s
namespace A {
struct C {
static int cx;
int N;
N::x = 0; // expected-error {{expected a class or namespace}}
{ int A; A::ax = 0; }
- { enum A {}; A::ax = 0; }
- { enum A { A }; A::ax = 0; }
- { typedef int A; A::ax = 0; }
- { typedef int A(); A::ax = 0; }
+ { typedef int A; A::ax = 0; } // expected-error{{expected a class or namespace}}
+ { int A(); A::ax = 0; }
{ typedef A::C A; A::ax = 0; } // expected-error {{no member named 'ax'}}
{ typedef A::C A; A::cx = 0; }
}
int A2::RC::x; // expected-error{{non-static data member defined out-of-line}}
void A2::CC::NC::m(); // expected-error{{out-of-line declaration of a member must be a definition}}
+
+
+namespace E {
+ int X = 5;
+
+ namespace Nested {
+ enum E {
+ X = 0
+ };
+
+ void f() {
+ return E::X; // expected-error{{expected a class or namespace}}
+ }
+ }
+}