From: Chris Lattner Date: Tue, 12 Jan 2010 20:58:53 +0000 (+0000) Subject: implement PR6007, diagnosing invalid attribute((section)) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a1e1dc77e995b746826b64752751dbf35f323767;p=clang implement PR6007, diagnosing invalid attribute((section)) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93255 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 645045e84d..4cd8a95223 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index ceab525db1..1a12208e5a 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -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(D) && cast(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) { diff --git a/test/Sema/attr-section.c b/test/Sema/attr-section.c index 20ae2e3547..614f294d23 100644 --- a/test/Sema/attr-section.c +++ b/test/Sema/attr-section.c @@ -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. +} \ No newline at end of file