forked from OSchip/llvm-project
Produce a warning for mismatched section attributes. Completest pr9356.
llvm-svn: 156727
This commit is contained in:
parent
bac0fdbd0b
commit
9869c3a10f
|
@ -25,6 +25,7 @@ def AmbigMemberTemplate : DiagGroup<"ambiguous-member-template">;
|
|||
def : DiagGroup<"attributes">;
|
||||
def : DiagGroup<"bad-function-cast">;
|
||||
def Availability : DiagGroup<"availability">;
|
||||
def Section : DiagGroup<"section">;
|
||||
def AutoImport : DiagGroup<"auto-import">;
|
||||
def ConstantConversion : DiagGroup<"constant-conversion">;
|
||||
def LiteralConversion : DiagGroup<"literal-conversion">;
|
||||
|
|
|
@ -1567,10 +1567,14 @@ def warn_objc_redundant_literal_use : Warning<
|
|||
|
||||
def err_only_annotate_after_access_spec : Error<
|
||||
"access specifier can only have annotation attributes">;
|
||||
|
||||
def err_attribute_section_invalid_for_target : Error<
|
||||
"argument to 'section' attribute is not valid for this target: %0">;
|
||||
def err_attribute_section_local_variable : Error<
|
||||
"'section' attribute is not valid on local variables">;
|
||||
def warn_mismatched_section : Warning<
|
||||
"section does not match previous declaration">, InGroup<Section>;
|
||||
|
||||
def err_attribute_aligned_not_power_of_two : Error<
|
||||
"requested alignment is not a power of 2">;
|
||||
def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<
|
||||
|
|
|
@ -1572,6 +1572,8 @@ public:
|
|||
bool mergeDLLExportAttr(Decl *D, SourceRange Range, bool Inherited);
|
||||
bool mergeFormatAttr(Decl *D, SourceRange Range, bool Inherited,
|
||||
StringRef Format, int FormatIdx, int FirstArg);
|
||||
bool mergeSectionAttr(Decl *D, SourceRange Range, bool Inherited,
|
||||
StringRef Name);
|
||||
bool mergeDeclAttribute(Decl *New, InheritableAttr *Attr);
|
||||
|
||||
void mergeDeclAttributes(Decl *New, Decl *Old, bool MergeDeprecation = true);
|
||||
|
|
|
@ -1678,6 +1678,9 @@ bool Sema::mergeDeclAttribute(Decl *D, InheritableAttr *Attr) {
|
|||
return mergeFormatAttr(D, FA->getRange(), true, FA->getType(),
|
||||
FA->getFormatIdx(), FA->getFirstArg());
|
||||
|
||||
if (SectionAttr *SA = dyn_cast<SectionAttr>(Attr))
|
||||
return mergeSectionAttr(D, SA->getRange(), true, SA->getName());
|
||||
|
||||
if (!DeclHasAttr(D, Attr)) {
|
||||
InheritableAttr *NewAttr = cast<InheritableAttr>(Attr->clone(Context));
|
||||
NewAttr->setInherited(true);
|
||||
|
|
|
@ -2286,6 +2286,22 @@ static void handleReqdWorkGroupSize(Sema &S, Decl *D,
|
|||
WGSize[2]));
|
||||
}
|
||||
|
||||
bool Sema::mergeSectionAttr(Decl *D, SourceRange Range, bool Inherited,
|
||||
StringRef Name) {
|
||||
if (SectionAttr *ExistingAttr = D->getAttr<SectionAttr>()) {
|
||||
if (ExistingAttr->getName() == Name)
|
||||
return false;
|
||||
Diag(ExistingAttr->getLocation(), diag::warn_mismatched_section);
|
||||
Diag(Range.getBegin(), diag::note_previous_attribute);
|
||||
return false;
|
||||
}
|
||||
SectionAttr *Attr = ::new (Context) SectionAttr(Range, Context, Name);
|
||||
if (Inherited)
|
||||
Attr->setInherited(true);
|
||||
D->addAttr(Attr);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
||||
// Attribute has no arguments.
|
||||
if (!checkAttributeNumArgs(S, Attr, 1))
|
||||
|
@ -2313,9 +2329,7 @@ static void handleSectionAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
S.Diag(SE->getLocStart(), diag::err_attribute_section_local_variable);
|
||||
return;
|
||||
}
|
||||
|
||||
D->addAttr(::new (S.Context) SectionAttr(Attr.getRange(), S.Context,
|
||||
SE->getString()));
|
||||
S.mergeSectionAttr(D, Attr.getRange(), false, SE->getString());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -13,3 +13,7 @@ void test() {
|
|||
__attribute__((section("NEAR,x"))) int n1; // expected-error {{'section' attribute is not valid on local variables}}
|
||||
__attribute__((section("NEAR,x"))) static int n2; // ok.
|
||||
}
|
||||
|
||||
// pr9356
|
||||
void __attribute__((section("foo,zed"))) test2(void); // expected-note {{previous attribute is here}}
|
||||
void __attribute__((section("bar,zed"))) test2(void) {} // expected-warning {{section does not match previous declaration}}
|
||||
|
|
Loading…
Reference in New Issue