mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Predicate to detect when a RecordDecl is really the injected-class-name
llvm-svn: 67687
This commit is contained in:
@@ -1113,6 +1113,21 @@ public:
|
||||
AnonymousStructOrUnion = Anon;
|
||||
}
|
||||
|
||||
/// \brief Determines whether this declaration represents the
|
||||
/// injected class name.
|
||||
///
|
||||
/// The injected class name in C++ is the name of the class that
|
||||
/// appears inside the class itself. For example:
|
||||
///
|
||||
/// \code
|
||||
/// struct C {
|
||||
/// // C is implicitly declared here as a synonym for the class name.
|
||||
/// };
|
||||
///
|
||||
/// C::C c; // same as "C c;"
|
||||
/// \endcode
|
||||
bool isInjectedClassName() const;
|
||||
|
||||
/// getDefinition - Returns the RecordDecl that actually defines this
|
||||
/// struct/union/class. When determining whether or not a struct/union/class
|
||||
/// is completely defined, one should use this method as opposed to
|
||||
|
||||
@@ -491,6 +491,11 @@ void RecordDecl::Destroy(ASTContext& C) {
|
||||
TagDecl::Destroy(C);
|
||||
}
|
||||
|
||||
bool RecordDecl::isInjectedClassName() const {
|
||||
return isImplicit() && getDeclName() && getDeclContext()->isRecord() &&
|
||||
cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName();
|
||||
}
|
||||
|
||||
/// completeDefinition - Notes that the definition of this type is now
|
||||
/// complete.
|
||||
void RecordDecl::completeDefinition(ASTContext& C) {
|
||||
|
||||
@@ -3398,6 +3398,8 @@ void Sema::ActOnTagStartDefinition(Scope *S, DeclTy *TagD) {
|
||||
Record->getIdentifier(), Record);
|
||||
InjectedClassName->setImplicit();
|
||||
PushOnScopeChains(InjectedClassName, S);
|
||||
assert(InjectedClassName->isInjectedClassName() &&
|
||||
"Broken injected-class-name");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user