зеркало из https://github.com/microsoft/clang-1.git
Revert 132332 (Microsoft friend as a forward declaration), John McCall pointed out a better/simpler way to do it.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132369 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
d127bcbaab
Коммит
5aecb786a3
|
@ -1084,11 +1084,6 @@ public:
|
|||
bool &OwnedDecl, bool &IsDependent, bool ScopedEnum,
|
||||
bool ScopedEnumUsesClassTag, TypeResult UnderlyingType);
|
||||
|
||||
void InjectMicrosoftFriendForwardDeclaration(unsigned TagSpec,
|
||||
SourceLocation KWLoc,
|
||||
IdentifierInfo *Name,
|
||||
SourceLocation NameLoc);
|
||||
|
||||
Decl *ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc,
|
||||
unsigned TagSpec, SourceLocation TagLoc,
|
||||
CXXScopeSpec &SS,
|
||||
|
|
|
@ -6631,42 +6631,6 @@ bool Sema::isAcceptableTagRedeclaration(const TagDecl *Previous,
|
|||
return false;
|
||||
}
|
||||
|
||||
/// InjectMicrosoftFriendForwardDeclaration - For compatibility with MSVC,
|
||||
/// a friend declaration also act as a forward declaration if the tag name
|
||||
/// is not already declared. The tag name is declared in the next outermost
|
||||
/// non record scope.
|
||||
/// Example:
|
||||
///
|
||||
/// class A {
|
||||
/// friend class B;
|
||||
/// B* b;
|
||||
/// };
|
||||
/// B* global_b;
|
||||
|
||||
void Sema::InjectMicrosoftFriendForwardDeclaration(unsigned TagSpec,
|
||||
SourceLocation KWLoc,
|
||||
IdentifierInfo *Name,
|
||||
SourceLocation NameLoc) {
|
||||
NamedDecl *N = LookupSingleName(getCurScope(), Name, NameLoc,
|
||||
Sema::LookupTagName);
|
||||
if (!N) {
|
||||
DeclContext *ContextToAdd = CurContext;
|
||||
while (ContextToAdd->isRecord())
|
||||
ContextToAdd = ContextToAdd->getParent();
|
||||
|
||||
TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForTypeSpec(TagSpec);
|
||||
TagDecl *New = CXXRecordDecl::Create(Context, Kind, ContextToAdd, KWLoc,
|
||||
NameLoc, Name, 0);
|
||||
// Recreate the DeclContext.
|
||||
ContextRAII SavedContext(*this, ContextToAdd);
|
||||
if (getCurScope()->getFnParent())
|
||||
PushOnScopeChains(New, getScopeForContext(ContextToAdd), true);
|
||||
else
|
||||
ContextToAdd->addDecl(New);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// ActOnTag - This is invoked when we see 'struct foo' or 'struct {'. In the
|
||||
/// former case, Name will be non-null. In the later case, Name will be null.
|
||||
/// TagSpec indicates what kind of tag this is. TUK indicates whether this is a
|
||||
|
@ -6684,9 +6648,6 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
|
|||
"Nameless record must be a definition!");
|
||||
assert(TemplateParameterLists.size() == 0 || TUK != TUK_Reference);
|
||||
|
||||
if (getLangOptions().Microsoft && TUK == Sema::TUK_Friend)
|
||||
InjectMicrosoftFriendForwardDeclaration(TagSpec, KWLoc, Name, NameLoc);
|
||||
|
||||
OwnedDecl = false;
|
||||
TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForTypeSpec(TagSpec);
|
||||
|
||||
|
|
|
@ -226,29 +226,4 @@ private:
|
|||
using B::f; // expected-warning {{using declaration refers to inaccessible member 'ms_using_declaration_bug::B::f', which refers to accessible member 'ms_using_declaration_bug::A::f', accepted for Microsoft compatibility}}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
namespace friend_as_a_forward_decl {
|
||||
|
||||
class A {
|
||||
class Nested {
|
||||
friend class B;
|
||||
B* b;
|
||||
};
|
||||
B* b;
|
||||
};
|
||||
B* global_b;
|
||||
|
||||
|
||||
void f()
|
||||
{
|
||||
class Local {
|
||||
friend class Z;
|
||||
Z* b;
|
||||
};
|
||||
Z* b;
|
||||
}
|
||||
|
||||
}
|
Загрузка…
Ссылка в новой задаче