implement PR6007, diagnosing invalid attribute((section))

llvm-svn: 93255
This commit is contained in:
Chris Lattner 2010-01-12 20:58:53 +00:00
parent a77e48c322
commit 20aee9b914
3 changed files with 17 additions and 5 deletions

View File

@ -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<

View File

@ -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) {

View File

@ -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.
}