forked from OSchip/llvm-project
implement PR6007, diagnosing invalid attribute((section))
llvm-svn: 93255
This commit is contained in:
parent
a77e48c322
commit
20aee9b914
|
@ -683,6 +683,8 @@ def err_attribute_not_string : Error<
|
|||
"argument to %0 attribute was not a string literal">;
|
||||
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 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<
|
||||
|
|
|
@ -926,14 +926,19 @@ static void HandleSectionAttr(Decl *D, const AttributeList &Attr, Sema &S) {
|
|||
|
||||
// If the target wants to validate the section specifier, make it happen.
|
||||
std::string Error = S.Context.Target.isValidSectionSpecifier(SE->getString());
|
||||
if (Error.empty()) {
|
||||
D->addAttr(::new (S.Context) SectionAttr(SE->getString()));
|
||||
if (!Error.empty()) {
|
||||
S.Diag(SE->getLocStart(), diag::err_attribute_section_invalid_for_target)
|
||||
<< Error;
|
||||
return;
|
||||
}
|
||||
|
||||
S.Diag(SE->getLocStart(), diag::err_attribute_section_invalid_for_target)
|
||||
<< Error;
|
||||
|
||||
// This attribute cannot be applied to local variables.
|
||||
if (isa<VarDecl>(D) && cast<VarDecl>(D)->hasLocalStorage()) {
|
||||
S.Diag(SE->getLocStart(), diag::err_attribute_section_local_variable);
|
||||
return;
|
||||
}
|
||||
|
||||
D->addAttr(::new (S.Context) SectionAttr(SE->getString()));
|
||||
}
|
||||
|
||||
static void HandleCDeclAttr(Decl *d, const AttributeList &Attr, Sema &S) {
|
||||
|
|
|
@ -8,3 +8,8 @@ int x __attribute__((section(
|
|||
int y __attribute__((section(
|
||||
"sadf"))); // expected-error {{mach-o section specifier requires a segment and section separated by a comma}}
|
||||
|
||||
// PR6007
|
||||
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.
|
||||
}
|
Loading…
Reference in New Issue