Use RecordFirst/RecordLast range checks in DeclContext

llvm-svn: 65489
This commit is contained in:
Douglas Gregor 2009-02-26 00:02:51 +00:00
parent d54dfb8718
commit 8d0921617e
3 changed files with 14 additions and 5 deletions

View File

@ -440,7 +440,7 @@ public:
}
bool isRecord() const {
return DeclKind == Decl::Record || DeclKind == Decl::CXXRecord;
return DeclKind >= Decl::RecordFirst && DeclKind <= Decl::RecordLast;
}
bool isNamespace() const {

View File

@ -409,7 +409,7 @@ bool DeclContext::isTransparentContext() const {
return true; // FIXME: Check for C++0x scoped enums
else if (DeclKind == Decl::LinkageSpec)
return true;
else if (DeclKind == Decl::Record || DeclKind == Decl::CXXRecord)
else if (DeclKind >= Decl::RecordFirst && DeclKind <= Decl::RecordLast)
return cast<RecordDecl>(this)->isAnonymousStructOrUnion();
else if (DeclKind == Decl::Namespace)
return false; // FIXME: Check for C++0x inline namespaces

View File

@ -37,11 +37,19 @@ template <> struct X<float> { int bar(); }; // #2
typedef int int_type;
void testme(X<int_type> *x1, X<float, int> *x2) {
x1->foo(); // okay: refers to #1
x2->bar(); // okay: refers to #2
(void)x1->foo(); // okay: refers to #1
(void)x2->bar(); // okay: refers to #2
}
// Diagnose specializations in a different namespace
// Make sure specializations are proper classes.
template<>
struct A<char> {
A();
};
A<char>::A() { }
// Diagnose specialization errors
struct A<double> { }; // expected-error{{template specialization requires 'template<>'}}
template<typename T> // expected-error{{class template partial specialization is not yet supported}}
@ -72,3 +80,4 @@ namespace M {
template<> struct N::B<char> {
int testf(int x) { return f(x); }
};