Improve clarity/consistency of a few UsingDecl methods and related helpers.
No functionality change. In Sema helper functions: * renamed isTypeName as HasTypenameKeyword In UsingDecl: * renamed get/setUsingLocation to get/setUsingLoc * renamed is/setTypeName as has/setTypename llvm-svn: 186816
This commit is contained in:
parent
b095c09330
commit
e05a3cf648
|
@ -2741,7 +2741,7 @@ public:
|
|||
class UsingDecl : public NamedDecl {
|
||||
virtual void anchor();
|
||||
|
||||
/// \brief The source location of the "using" location itself.
|
||||
/// \brief The source location of the 'using' keyword itself.
|
||||
SourceLocation UsingLocation;
|
||||
|
||||
/// \brief The nested-name-specifier that precedes the name.
|
||||
|
@ -2760,18 +2760,18 @@ class UsingDecl : public NamedDecl {
|
|||
|
||||
UsingDecl(DeclContext *DC, SourceLocation UL,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
const DeclarationNameInfo &NameInfo, bool IsTypeNameArg)
|
||||
const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
|
||||
: NamedDecl(Using, DC, NameInfo.getLoc(), NameInfo.getName()),
|
||||
UsingLocation(UL), QualifierLoc(QualifierLoc),
|
||||
DNLoc(NameInfo.getInfo()), FirstUsingShadow(0, IsTypeNameArg) {
|
||||
DNLoc(NameInfo.getInfo()), FirstUsingShadow(0, HasTypenameKeyword) {
|
||||
}
|
||||
|
||||
public:
|
||||
/// \brief Returns the source location of the "using" keyword.
|
||||
SourceLocation getUsingLocation() const { return UsingLocation; }
|
||||
/// \brief Return the source location of the 'using' keyword.
|
||||
SourceLocation getUsingLoc() const { return UsingLocation; }
|
||||
|
||||
/// \brief Set the source location of the 'using' keyword.
|
||||
void setUsingLocation(SourceLocation L) { UsingLocation = L; }
|
||||
void setUsingLoc(SourceLocation L) { UsingLocation = L; }
|
||||
|
||||
/// \brief Retrieve the nested-name-specifier that qualifies the name,
|
||||
/// with source-location information.
|
||||
|
@ -2790,10 +2790,10 @@ public:
|
|||
bool isAccessDeclaration() const { return UsingLocation.isInvalid(); }
|
||||
|
||||
/// \brief Return true if the using declaration has 'typename'.
|
||||
bool isTypeName() const { return FirstUsingShadow.getInt(); }
|
||||
bool hasTypename() const { return FirstUsingShadow.getInt(); }
|
||||
|
||||
/// \brief Sets whether the using declaration has 'typename'.
|
||||
void setTypeName(bool TN) { FirstUsingShadow.setInt(TN); }
|
||||
void setTypename(bool TN) { FirstUsingShadow.setInt(TN); }
|
||||
|
||||
/// \brief Iterates through the using shadow declarations associated with
|
||||
/// this using declaration.
|
||||
|
@ -2851,7 +2851,7 @@ public:
|
|||
SourceLocation UsingL,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
bool IsTypeNameArg);
|
||||
bool HasTypenameKeyword);
|
||||
|
||||
static UsingDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
||||
|
|
|
@ -3565,7 +3565,7 @@ public:
|
|||
NamedDecl *Target);
|
||||
|
||||
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc,
|
||||
bool isTypeName,
|
||||
bool HasTypenameKeyword,
|
||||
const CXXScopeSpec &SS,
|
||||
SourceLocation NameLoc,
|
||||
const LookupResult &Previous);
|
||||
|
@ -3579,7 +3579,7 @@ public:
|
|||
const DeclarationNameInfo &NameInfo,
|
||||
AttributeList *AttrList,
|
||||
bool IsInstantiation,
|
||||
bool IsTypeName,
|
||||
bool HasTypenameKeyword,
|
||||
SourceLocation TypenameLoc);
|
||||
|
||||
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD);
|
||||
|
@ -3591,7 +3591,7 @@ public:
|
|||
CXXScopeSpec &SS,
|
||||
UnqualifiedId &Name,
|
||||
AttributeList *AttrList,
|
||||
bool IsTypeName,
|
||||
bool HasTypenameKeyword,
|
||||
SourceLocation TypenameLoc);
|
||||
Decl *ActOnAliasDeclaration(Scope *CurScope,
|
||||
AccessSpecifier AS,
|
||||
|
|
|
@ -1959,8 +1959,8 @@ void UsingDecl::removeShadowDecl(UsingShadowDecl *S) {
|
|||
UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
bool IsTypeNameArg) {
|
||||
return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, IsTypeNameArg);
|
||||
bool HasTypename) {
|
||||
return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
|
||||
}
|
||||
|
||||
UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
|
||||
|
|
|
@ -1157,7 +1157,7 @@ void DeclPrinter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PID) {
|
|||
void DeclPrinter::VisitUsingDecl(UsingDecl *D) {
|
||||
if (!D->isAccessDeclaration())
|
||||
Out << "using ";
|
||||
if (D->isTypeName())
|
||||
if (D->hasTypename())
|
||||
Out << "typename ";
|
||||
D->getQualifier()->print(Out, Policy);
|
||||
Out << *D;
|
||||
|
|
|
@ -451,7 +451,7 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
|
|||
Decl **OwnedType) {
|
||||
CXXScopeSpec SS;
|
||||
SourceLocation TypenameLoc;
|
||||
bool IsTypeName = false;
|
||||
bool HasTypenameKeyword = false;
|
||||
ParsedAttributesWithRange Attrs(AttrFactory);
|
||||
|
||||
// FIXME: Simply skip the attributes and diagnose, don't bother parsing them.
|
||||
|
@ -464,7 +464,7 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
|
|||
// FIXME: This is wrong; we should parse this as a typename-specifier.
|
||||
if (Tok.is(tok::kw_typename)) {
|
||||
TypenameLoc = ConsumeToken();
|
||||
IsTypeName = true;
|
||||
HasTypenameKeyword = true;
|
||||
}
|
||||
|
||||
// Parse nested-name-specifier.
|
||||
|
@ -549,7 +549,7 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
|
|||
// No removal fixit: can't recover from this.
|
||||
SkipUntil(tok::semi);
|
||||
return 0;
|
||||
} else if (IsTypeName)
|
||||
} else if (HasTypenameKeyword)
|
||||
Diag(TypenameLoc, diag::err_alias_declaration_not_identifier)
|
||||
<< FixItHint::CreateRemoval(SourceRange(TypenameLoc,
|
||||
SS.isNotEmpty() ? SS.getEndLoc() : TypenameLoc));
|
||||
|
@ -593,11 +593,11 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
|
|||
|
||||
// "typename" keyword is allowed for identifiers only,
|
||||
// because it may be a type definition.
|
||||
if (IsTypeName && Name.getKind() != UnqualifiedId::IK_Identifier) {
|
||||
if (HasTypenameKeyword && Name.getKind() != UnqualifiedId::IK_Identifier) {
|
||||
Diag(Name.getSourceRange().getBegin(), diag::err_typename_identifiers_only)
|
||||
<< FixItHint::CreateRemoval(SourceRange(TypenameLoc));
|
||||
// Proceed parsing, but reset the IsTypeName flag.
|
||||
IsTypeName = false;
|
||||
// Proceed parsing, but reset the HasTypenameKeyword flag.
|
||||
HasTypenameKeyword = false;
|
||||
}
|
||||
|
||||
if (IsAliasDecl) {
|
||||
|
@ -610,9 +610,10 @@ Decl *Parser::ParseUsingDeclaration(unsigned Context,
|
|||
TypeAlias);
|
||||
}
|
||||
|
||||
return Actions.ActOnUsingDeclaration(getCurScope(), AS, true, UsingLoc, SS,
|
||||
Name, Attrs.getList(),
|
||||
IsTypeName, TypenameLoc);
|
||||
return Actions.ActOnUsingDeclaration(getCurScope(), AS,
|
||||
/* HasUsingKeyword */ true, UsingLoc,
|
||||
SS, Name, Attrs.getList(),
|
||||
HasTypenameKeyword, TypenameLoc);
|
||||
}
|
||||
|
||||
/// ParseStaticAssertDeclaration - Parse C++0x or C11 static_assert-declaration.
|
||||
|
@ -1971,10 +1972,11 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
|
|||
return;
|
||||
|
||||
Actions.ActOnUsingDeclaration(getCurScope(), AS,
|
||||
false, SourceLocation(),
|
||||
/* HasUsingKeyword */ false,
|
||||
SourceLocation(),
|
||||
SS, Name,
|
||||
/* AttrList */ 0,
|
||||
/* IsTypeName */ false,
|
||||
/* HasTypenameKeyword */ false,
|
||||
SourceLocation());
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -6756,7 +6756,7 @@ Decl *Sema::ActOnUsingDeclaration(Scope *S,
|
|||
CXXScopeSpec &SS,
|
||||
UnqualifiedId &Name,
|
||||
AttributeList *AttrList,
|
||||
bool IsTypeName,
|
||||
bool HasTypenameKeyword,
|
||||
SourceLocation TypenameLoc) {
|
||||
assert(S->getFlags() & Scope::DeclScope && "Invalid Scope.");
|
||||
|
||||
|
@ -6812,7 +6812,7 @@ Decl *Sema::ActOnUsingDeclaration(Scope *S,
|
|||
NamedDecl *UD = BuildUsingDeclaration(S, AS, UsingLoc, SS,
|
||||
TargetNameInfo, AttrList,
|
||||
/* IsInstantiation */ false,
|
||||
IsTypeName, TypenameLoc);
|
||||
HasTypenameKeyword, TypenameLoc);
|
||||
if (UD)
|
||||
PushOnScopeChains(UD, S, /*AddToContext*/ false);
|
||||
|
||||
|
@ -7049,9 +7049,10 @@ void Sema::HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow) {
|
|||
|
||||
class UsingValidatorCCC : public CorrectionCandidateCallback {
|
||||
public:
|
||||
UsingValidatorCCC(bool IsTypeName, bool IsInstantiation)
|
||||
: IsTypeName(IsTypeName), IsInstantiation(IsInstantiation) {}
|
||||
|
||||
UsingValidatorCCC(bool HasTypenameKeyword, bool IsInstantiation)
|
||||
: HasTypenameKeyword(HasTypenameKeyword),
|
||||
IsInstantiation(IsInstantiation) {}
|
||||
|
||||
virtual bool ValidateCandidate(const TypoCorrection &Candidate) {
|
||||
if (NamedDecl *ND = Candidate.getCorrectionDecl()) {
|
||||
if (isa<NamespaceDecl>(ND))
|
||||
|
@ -7062,9 +7063,9 @@ public:
|
|||
if (droppedSpecifier)
|
||||
return false;
|
||||
else if (isa<TypeDecl>(ND))
|
||||
return IsTypeName || !IsInstantiation;
|
||||
return HasTypenameKeyword || !IsInstantiation;
|
||||
else
|
||||
return !IsTypeName;
|
||||
return !HasTypenameKeyword;
|
||||
} else {
|
||||
// Keywords are not valid here.
|
||||
return false;
|
||||
|
@ -7072,7 +7073,7 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
bool IsTypeName;
|
||||
bool HasTypenameKeyword;
|
||||
bool IsInstantiation;
|
||||
};
|
||||
|
||||
|
@ -7087,7 +7088,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
const DeclarationNameInfo &NameInfo,
|
||||
AttributeList *AttrList,
|
||||
bool IsInstantiation,
|
||||
bool IsTypeName,
|
||||
bool HasTypenameKeyword,
|
||||
SourceLocation TypenameLoc) {
|
||||
assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
|
||||
SourceLocation IdentLoc = NameInfo.getLoc();
|
||||
|
@ -7122,7 +7123,8 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
}
|
||||
|
||||
// Check for invalid redeclarations.
|
||||
if (CheckUsingDeclRedeclaration(UsingLoc, IsTypeName, SS, IdentLoc, Previous))
|
||||
if (CheckUsingDeclRedeclaration(UsingLoc, HasTypenameKeyword,
|
||||
SS, IdentLoc, Previous))
|
||||
return 0;
|
||||
|
||||
// Check for bad qualifiers.
|
||||
|
@ -7133,7 +7135,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
NamedDecl *D;
|
||||
NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
|
||||
if (!LookupContext) {
|
||||
if (IsTypeName) {
|
||||
if (HasTypenameKeyword) {
|
||||
// FIXME: not all declaration name kinds are legal here
|
||||
D = UnresolvedUsingTypenameDecl::Create(Context, CurContext,
|
||||
UsingLoc, TypenameLoc,
|
||||
|
@ -7145,7 +7147,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
}
|
||||
} else {
|
||||
D = UsingDecl::Create(Context, CurContext, UsingLoc, QualifierLoc,
|
||||
NameInfo, IsTypeName);
|
||||
NameInfo, HasTypenameKeyword);
|
||||
}
|
||||
D->setAccess(AS);
|
||||
CurContext->addDecl(D);
|
||||
|
@ -7187,7 +7189,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
|
||||
// Try to correct typos if possible.
|
||||
if (R.empty()) {
|
||||
UsingValidatorCCC CCC(IsTypeName, IsInstantiation);
|
||||
UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation);
|
||||
if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(),
|
||||
R.getLookupKind(), S, &SS, CCC)){
|
||||
// We reject any correction for which ND would be NULL.
|
||||
|
@ -7218,7 +7220,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
return UD;
|
||||
}
|
||||
|
||||
if (IsTypeName) {
|
||||
if (HasTypenameKeyword) {
|
||||
// If we asked for a typename and got a non-type decl, error out.
|
||||
if (!R.getAsSingle<TypeDecl>()) {
|
||||
Diag(IdentLoc, diag::err_using_typename_non_type);
|
||||
|
@ -7259,7 +7261,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
|
|||
|
||||
/// Additional checks for a using declaration referring to a constructor name.
|
||||
bool Sema::CheckInheritingConstructorUsingDecl(UsingDecl *UD) {
|
||||
assert(!UD->isTypeName() && "expecting a constructor name");
|
||||
assert(!UD->hasTypename() && "expecting a constructor name");
|
||||
|
||||
const Type *SourceType = UD->getQualifier()->getAsType();
|
||||
assert(SourceType &&
|
||||
|
@ -7280,7 +7282,7 @@ bool Sema::CheckInheritingConstructorUsingDecl(UsingDecl *UD) {
|
|||
|
||||
if (BaseIt == BaseE) {
|
||||
// Did not find SourceType in the bases.
|
||||
Diag(UD->getUsingLocation(),
|
||||
Diag(UD->getUsingLoc(),
|
||||
diag::err_using_decl_constructor_not_in_direct_base)
|
||||
<< UD->getNameInfo().getSourceRange()
|
||||
<< QualType(SourceType, 0) << TargetClass;
|
||||
|
@ -7297,7 +7299,7 @@ bool Sema::CheckInheritingConstructorUsingDecl(UsingDecl *UD) {
|
|||
/// redeclaration. Note that this is checking only for the using decl
|
||||
/// itself, not for any ill-formedness among the UsingShadowDecls.
|
||||
bool Sema::CheckUsingDeclRedeclaration(SourceLocation UsingLoc,
|
||||
bool isTypeName,
|
||||
bool HasTypenameKeyword,
|
||||
const CXXScopeSpec &SS,
|
||||
SourceLocation NameLoc,
|
||||
const LookupResult &Prev) {
|
||||
|
@ -7320,7 +7322,7 @@ bool Sema::CheckUsingDeclRedeclaration(SourceLocation UsingLoc,
|
|||
bool DTypename;
|
||||
NestedNameSpecifier *DQual;
|
||||
if (UsingDecl *UD = dyn_cast<UsingDecl>(D)) {
|
||||
DTypename = UD->isTypeName();
|
||||
DTypename = UD->hasTypename();
|
||||
DQual = UD->getQualifier();
|
||||
} else if (UnresolvedUsingValueDecl *UD
|
||||
= dyn_cast<UnresolvedUsingValueDecl>(D)) {
|
||||
|
@ -7334,7 +7336,7 @@ bool Sema::CheckUsingDeclRedeclaration(SourceLocation UsingLoc,
|
|||
|
||||
// using decls differ if one says 'typename' and the other doesn't.
|
||||
// FIXME: non-dependent using decls?
|
||||
if (isTypeName != DTypename) continue;
|
||||
if (HasTypenameKeyword != DTypename) continue;
|
||||
|
||||
// using decls differ if they name different scopes (but note that
|
||||
// template instantiation can cause this check to trigger when it
|
||||
|
|
|
@ -2102,10 +2102,10 @@ Decl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) {
|
|||
Sema::ForRedeclaration);
|
||||
|
||||
UsingDecl *NewUD = UsingDecl::Create(SemaRef.Context, Owner,
|
||||
D->getUsingLocation(),
|
||||
D->getUsingLoc(),
|
||||
QualifierLoc,
|
||||
NameInfo,
|
||||
D->isTypeName());
|
||||
D->hasTypename());
|
||||
|
||||
CXXScopeSpec SS;
|
||||
SS.Adopt(QualifierLoc);
|
||||
|
@ -2114,15 +2114,15 @@ Decl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) {
|
|||
SemaRef.LookupQualifiedName(Prev, Owner);
|
||||
|
||||
// Check for invalid redeclarations.
|
||||
if (SemaRef.CheckUsingDeclRedeclaration(D->getUsingLocation(),
|
||||
D->isTypeName(), SS,
|
||||
if (SemaRef.CheckUsingDeclRedeclaration(D->getUsingLoc(),
|
||||
D->hasTypename(), SS,
|
||||
D->getLocation(), Prev))
|
||||
NewUD->setInvalidDecl();
|
||||
|
||||
}
|
||||
|
||||
if (!NewUD->isInvalidDecl() &&
|
||||
SemaRef.CheckUsingDeclQualifier(D->getUsingLocation(), SS,
|
||||
SemaRef.CheckUsingDeclQualifier(D->getUsingLoc(), SS,
|
||||
D->getLocation()))
|
||||
NewUD->setInvalidDecl();
|
||||
|
||||
|
|
|
@ -9385,7 +9385,7 @@ QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
|
|||
TypeDecl *Ty;
|
||||
if (isa<UsingDecl>(D)) {
|
||||
UsingDecl *Using = cast<UsingDecl>(D);
|
||||
assert(Using->isTypeName() &&
|
||||
assert(Using->hasTypename() &&
|
||||
"UnresolvedUsingTypenameDecl transformed to non-typename using");
|
||||
|
||||
// A valid resolved using typename decl points to exactly one type decl.
|
||||
|
|
|
@ -1069,11 +1069,11 @@ void ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
|
|||
|
||||
void ASTDeclReader::VisitUsingDecl(UsingDecl *D) {
|
||||
VisitNamedDecl(D);
|
||||
D->setUsingLocation(ReadSourceLocation(Record, Idx));
|
||||
D->setUsingLoc(ReadSourceLocation(Record, Idx));
|
||||
D->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
|
||||
ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx);
|
||||
D->FirstUsingShadow.setPointer(ReadDeclAs<UsingShadowDecl>(Record, Idx));
|
||||
D->setTypeName(Record[Idx++]);
|
||||
D->setTypename(Record[Idx++]);
|
||||
if (NamedDecl *Pattern = ReadDeclAs<NamedDecl>(Record, Idx))
|
||||
Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
|
||||
}
|
||||
|
|
|
@ -909,11 +909,11 @@ void ASTDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
|
|||
|
||||
void ASTDeclWriter::VisitUsingDecl(UsingDecl *D) {
|
||||
VisitNamedDecl(D);
|
||||
Writer.AddSourceLocation(D->getUsingLocation(), Record);
|
||||
Writer.AddSourceLocation(D->getUsingLoc(), Record);
|
||||
Writer.AddNestedNameSpecifierLoc(D->getQualifierLoc(), Record);
|
||||
Writer.AddDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record);
|
||||
Writer.AddDeclRef(D->FirstUsingShadow.getPointer(), Record);
|
||||
Record.push_back(D->isTypeName());
|
||||
Record.push_back(D->hasTypename());
|
||||
Writer.AddDeclRef(Context.getInstantiatedFromUsingDecl(D), Record);
|
||||
Code = serialization::DECL_USING;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue