Factor the member access specifier setting code into its own function. No intended functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67725 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-03-26 01:19:02 +00:00
Родитель 5aeccdbb4b
Коммит 0cf8830a45
3 изменённых файлов: 49 добавлений и 27 удалений

Просмотреть файл

@ -1616,6 +1616,13 @@ public:
FunctionDecl::StorageClass& SC);
DeclTy *ActOnConversionDeclarator(CXXConversionDecl *Conversion);
/// SetMemberAccessSpecifier - Set the access specifier of a member.
/// Returns true on error (when the previous member decl access specifier
/// is different from the new member decl access specifier).
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl,
NamedDecl *PrevMemberDecl,
AccessSpecifier LexicalAS);
//===--------------------------------------------------------------------===//
// C++ Derived Classes
//

Просмотреть файл

@ -3083,21 +3083,6 @@ TypedefDecl *Sema::ParseTypedefDecl(Scope *S, Declarator &D, QualType T,
return NewTD;
}
static const char *getAccessName(AccessSpecifier AS) {
switch (AS) {
default:
case AS_none:
assert("Invalid access specifier!");
return 0;
case AS_public:
return "public";
case AS_private:
return "private";
case AS_protected:
return "protected";
}
}
/// 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. TK indicates whether this is a
@ -3399,18 +3384,8 @@ CreateNewDecl:
// lexical context will be different from the semantic context.
New->setLexicalDeclContext(CurContext);
if (PrevDecl) {
// C++ [class.access.spec]p3: When a member is redeclared its access
// specifier must be same as its initial declaration.
if (AS != AS_none && AS != PrevDecl->getAccess()) {
Diag(Loc, diag::err_class_redeclared_with_different_access)
<< New << getAccessName(AS);
Diag(PrevDecl->getLocation(), diag::note_previous_access_declaration)
<< PrevDecl << getAccessName(PrevDecl->getAccess());
} else
New->setAccess(PrevDecl->getAccess());
} else
New->setAccess(AS);
// Set the access specifier.
SetMemberAccessSpecifier(New, PrevDecl, AS);
if (TK == TK_Definition)
New->startDefinition();

Просмотреть файл

@ -2529,3 +2529,43 @@ void Sema::SetDeclDeleted(DeclTy *dcl, SourceLocation DelLoc) {
}
Fn->setDeleted();
}
static const char *getAccessName(AccessSpecifier AS) {
switch (AS) {
default:
case AS_none:
assert("Invalid access specifier!");
return 0;
case AS_public:
return "public";
case AS_private:
return "private";
case AS_protected:
return "protected";
}
}
bool Sema::SetMemberAccessSpecifier(NamedDecl *MemberDecl,
NamedDecl *PrevMemberDecl,
AccessSpecifier LexicalAS) {
if (!PrevMemberDecl) {
// Use the lexical access specifier.
MemberDecl->setAccess(LexicalAS);
return false;
}
// C++ [class.access.spec]p3: When a member is redeclared its access
// specifier must be same as its initial declaration.
if (LexicalAS != AS_none && LexicalAS != PrevMemberDecl->getAccess()) {
Diag(MemberDecl->getLocation(),
diag::err_class_redeclared_with_different_access)
<< MemberDecl << getAccessName(LexicalAS);
Diag(PrevMemberDecl->getLocation(), diag::note_previous_access_declaration)
<< PrevMemberDecl << getAccessName(PrevMemberDecl->getAccess());
return true;
}
MemberDecl->setAccess(PrevMemberDecl->getAccess());
return false;
}