]> granicus.if.org Git - clang/commitdiff
Produce a warning for mismatched section attributes. Completest pr9356.
authorRafael Espindola <rafael.espindola@gmail.com>
Sun, 13 May 2012 02:42:42 +0000 (02:42 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sun, 13 May 2012 02:42:42 +0000 (02:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156727 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclAttr.cpp
test/Sema/attr-section.c

index 17852ae1e1c4cc67f92a587d7a0720b63530684f..8493257ba586c76b61060ced4b5c5c7d6284dbf5 100644 (file)
@@ -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">;
index ddb8b280fba25e183764d04d6fbfc6761f7ce056..2b7875b3328178772f8d905962486906fa948a86 100644 (file)
@@ -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<
index b43a69929fdb849cc13a3d0b056b6cf8e1c130bf..3e03befba9f244c5df7db7d779ff868dd7573ede 100644 (file)
@@ -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);
index 64caf2bacc9afe294a7ebfae493fd00e394fab0c..9828c180b19d3af67c544d439ae356a123e82cba 100644 (file)
@@ -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);
index 7c290f76eea0826accf8edc5c9ba22fbb15b78ee..947fe7af91815cb13eb2adea69f23246a83fcb4f 100644 (file)
@@ -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());
 }
 
 
index a9325254080ba8901e3eef86d75ddefa205127d7..69ca732517af63358a11e16caaabf959415cc2f6 100644 (file)
@@ -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}}