mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-02 02:38:04 +00:00
Sema: Allow null names to be passed in to isAcceptableTagRedeclaration
It's possible for TagRedeclarations to involve decls without a name, ie, anonymous enums. We hit some undefined behaviour if we bind these null names to the reference here. We never dereference the name, so it's harmless if it's null - make it a pointer to allow that. Fixes the Modules/submodules-merge-defs.cpp test under ubsan. llvm-svn: 241963
This commit is contained in:
parent
11e086d275
commit
c6ecb7c693
@ -1849,7 +1849,7 @@ public:
|
||||
bool isAcceptableTagRedeclaration(const TagDecl *Previous,
|
||||
TagTypeKind NewTag, bool isDefinition,
|
||||
SourceLocation NewTagLoc,
|
||||
const IdentifierInfo &Name);
|
||||
const IdentifierInfo *Name);
|
||||
|
||||
enum TagUseKind {
|
||||
TUK_Reference, // Reference to a tag: 'struct foo *X;'
|
||||
|
@ -11294,7 +11294,7 @@ static bool isClassCompatTagKind(TagTypeKind Tag)
|
||||
bool Sema::isAcceptableTagRedeclaration(const TagDecl *Previous,
|
||||
TagTypeKind NewTag, bool isDefinition,
|
||||
SourceLocation NewTagLoc,
|
||||
const IdentifierInfo &Name) {
|
||||
const IdentifierInfo *Name) {
|
||||
// C++ [dcl.type.elab]p3:
|
||||
// The class-key or enum keyword present in the
|
||||
// elaborated-type-specifier shall agree in kind with the
|
||||
@ -11323,7 +11323,7 @@ bool Sema::isAcceptableTagRedeclaration(const TagDecl *Previous,
|
||||
// In a template instantiation, do not offer fix-its for tag mismatches
|
||||
// since they usually mess up the template instead of fixing the problem.
|
||||
Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
|
||||
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << &Name
|
||||
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << Name
|
||||
<< getRedeclDiagFromTagKind(OldTag);
|
||||
return true;
|
||||
}
|
||||
@ -11342,7 +11342,7 @@ bool Sema::isAcceptableTagRedeclaration(const TagDecl *Previous,
|
||||
if (!previousMismatch) {
|
||||
previousMismatch = true;
|
||||
Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
|
||||
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << &Name
|
||||
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << Name
|
||||
<< getRedeclDiagFromTagKind(I->getTagKind());
|
||||
}
|
||||
Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
|
||||
@ -11364,7 +11364,7 @@ bool Sema::isAcceptableTagRedeclaration(const TagDecl *Previous,
|
||||
}
|
||||
|
||||
Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
|
||||
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << &Name
|
||||
<< getRedeclDiagFromTagKind(NewTag) << isTemplate << Name
|
||||
<< getRedeclDiagFromTagKind(OldTag);
|
||||
Diag(Redecl->getLocation(), diag::note_previous_use);
|
||||
|
||||
@ -11847,7 +11847,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
|
||||
// struct or something similar.
|
||||
if (!isAcceptableTagRedeclaration(PrevTagDecl, Kind,
|
||||
TUK == TUK_Definition, KWLoc,
|
||||
*Name)) {
|
||||
Name)) {
|
||||
bool SafeToContinue
|
||||
= (PrevTagDecl->getTagKind() != TTK_Enum &&
|
||||
Kind != TTK_Enum);
|
||||
|
@ -1008,7 +1008,7 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,
|
||||
// template declaration (7.1.5.3).
|
||||
RecordDecl *PrevRecordDecl = PrevClassTemplate->getTemplatedDecl();
|
||||
if (!isAcceptableTagRedeclaration(PrevRecordDecl, Kind,
|
||||
TUK == TUK_Definition, KWLoc, *Name)) {
|
||||
TUK == TUK_Definition, KWLoc, Name)) {
|
||||
Diag(KWLoc, diag::err_use_with_wrong_tag)
|
||||
<< Name
|
||||
<< FixItHint::CreateReplacement(KWLoc, PrevRecordDecl->getKindName());
|
||||
@ -2310,7 +2310,7 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK,
|
||||
assert(Id && "templated class must have an identifier");
|
||||
|
||||
if (!isAcceptableTagRedeclaration(D, TagKind, TUK == TUK_Definition,
|
||||
TagLoc, *Id)) {
|
||||
TagLoc, Id)) {
|
||||
Diag(TagLoc, diag::err_use_with_wrong_tag)
|
||||
<< Result
|
||||
<< FixItHint::CreateReplacement(SourceRange(TagLoc), D->getKindName());
|
||||
@ -6199,7 +6199,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,
|
||||
assert(Kind != TTK_Enum && "Invalid enum tag in class template spec!");
|
||||
if (!isAcceptableTagRedeclaration(ClassTemplate->getTemplatedDecl(),
|
||||
Kind, TUK == TUK_Definition, KWLoc,
|
||||
*ClassTemplate->getIdentifier())) {
|
||||
ClassTemplate->getIdentifier())) {
|
||||
Diag(KWLoc, diag::err_use_with_wrong_tag)
|
||||
<< ClassTemplate
|
||||
<< FixItHint::CreateReplacement(KWLoc,
|
||||
@ -7235,7 +7235,7 @@ Sema::ActOnExplicitInstantiation(Scope *S,
|
||||
|
||||
if (!isAcceptableTagRedeclaration(ClassTemplate->getTemplatedDecl(),
|
||||
Kind, /*isDefinition*/false, KWLoc,
|
||||
*ClassTemplate->getIdentifier())) {
|
||||
ClassTemplate->getIdentifier())) {
|
||||
Diag(KWLoc, diag::err_use_with_wrong_tag)
|
||||
<< ClassTemplate
|
||||
<< FixItHint::CreateReplacement(KWLoc,
|
||||
|
@ -989,7 +989,7 @@ TemplateInstantiator::RebuildElaboratedType(SourceLocation KeywordLoc,
|
||||
if (Id && Keyword != ETK_None && Keyword != ETK_Typename) {
|
||||
TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
|
||||
if (!SemaRef.isAcceptableTagRedeclaration(TD, Kind, /*isDefinition*/false,
|
||||
TagLocation, *Id)) {
|
||||
TagLocation, Id)) {
|
||||
SemaRef.Diag(TagLocation, diag::err_use_with_wrong_tag)
|
||||
<< Id
|
||||
<< FixItHint::CreateReplacement(SourceRange(TagLocation),
|
||||
|
@ -1010,7 +1010,7 @@ public:
|
||||
}
|
||||
|
||||
if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
|
||||
IdLoc, *Id)) {
|
||||
IdLoc, Id)) {
|
||||
SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
|
||||
SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
|
||||
return QualType();
|
||||
|
Loading…
Reference in New Issue
Block a user