[PATCH] D43359: Clean up 'target' attribute diagnostics

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 15 15:24:53 PST 2018


erichkeane created this revision.
erichkeane added reviewers: echristo, aaron.ballman.

There were a few issues previously with the target
attribute diagnostics implementation that lead to the
attribute being added to the AST despite having an error
in it.

This patch changes that, and adds a test to ensure it
does not get added to the AST.


https://reviews.llvm.org/D43359

Files:
  lib/Sema/SemaDeclAttr.cpp
  test/Sema/attr-target-ast.c
  test/Sema/attr-target.c
  test/SemaCXX/attr-target-mv.cpp


Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp
+++ lib/Sema/SemaDeclAttr.cpp
@@ -3024,15 +3024,18 @@
              << Unsupported << None << CurFeature;
   }
 
-  return true;
+  return false;
 }
 
 static void handleTargetAttr(Sema &S, Decl *D, const AttributeList &AL) {
   StringRef Str;
   SourceLocation LiteralLoc;
   if (!S.checkStringLiteralArgumentAttr(AL, 0, Str, &LiteralLoc) ||
-      !S.checkTargetAttr(LiteralLoc, Str))
+      S.checkTargetAttr(LiteralLoc, Str)) {
+    S.Diag(AL.getLoc(), diag::warn_attribute_ignored) << AL.getName();
     return;
+  }
+
   unsigned Index = AL.getAttributeSpellingListIndex();
   TargetAttr *NewAttr =
       ::new (S.Context) TargetAttr(AL.getRange(), S.Context, Str, Index);
Index: test/SemaCXX/attr-target-mv.cpp
===================================================================
--- test/SemaCXX/attr-target-mv.cpp
+++ test/SemaCXX/attr-target-mv.cpp
@@ -1,7 +1,8 @@
 // RUN: %clang_cc1 -triple x86_64-linux-gnu  -fsyntax-only -verify -fexceptions -fcxx-exceptions %s -std=c++14
 void __attribute__((target("default"))) invalid_features(void);
-//expected-error at +2 {{function multiversioning doesn't support feature 'hello_world'}}
-//expected-warning at +1 {{ignoring unsupported 'hello_world' in the target attribute string}}
+//expected-error at +3 {{function declaration is missing 'target' attribute in a multiversioned function}}
+//expected-warning at +2 {{ignoring unsupported 'hello_world' in the target attribute string}}
+//expected-warning at +1 {{'target' attribute ignored}}
 void __attribute__((target("hello_world"))) invalid_features(void);
 //expected-error at +1 {{function multiversioning doesn't support feature 'no-sse4.2'}}
 void __attribute__((target("no-sse4.2"))) invalid_features(void);
Index: test/Sema/attr-target-ast.c
===================================================================
--- test/Sema/attr-target-ast.c
+++ test/Sema/attr-target-ast.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -ast-dump %s | FileCheck %s
+
+int __attribute__((target("arch=hiss,arch=woof"))) pine_tree() { return 4; }
+// CHECK-NOT: arch=hiss
+// CHECK-NOT: arch=woof
Index: test/Sema/attr-target.c
===================================================================
--- test/Sema/attr-target.c
+++ test/Sema/attr-target.c
@@ -2,12 +2,18 @@
 
 int __attribute__((target("avx,sse4.2,arch=ivybridge"))) foo() { return 4; }
 int __attribute__((target())) bar() { return 4; } //expected-error {{'target' attribute takes one argument}}
+// expected-warning at +1 {{'target' attribute ignored}}
 int __attribute__((target("tune=sandybridge"))) baz() { return 4; } //expected-warning {{ignoring unsupported 'tune=' in the target attribute string}}
+// expected-warning at +1 {{'target' attribute ignored}}
 int __attribute__((target("fpmath=387"))) walrus() { return 4; } //expected-warning {{ignoring unsupported 'fpmath=' in the target attribute string}}
+// expected-warning at +1 {{'target' attribute ignored}}
 int __attribute__((target("avx,sse4.2,arch=hiss"))) meow() {  return 4; }//expected-warning {{ignoring unsupported architecture 'hiss' in the target attribute string}}
+// expected-warning at +1 {{'target' attribute ignored}}
 int __attribute__((target("woof"))) bark() {  return 4; }//expected-warning {{ignoring unsupported 'woof' in the target attribute string}}
 int __attribute__((target("arch="))) turtle() { return 4; } // no warning, same as saying 'nothing'.
+// expected-warning at +1 {{'target' attribute ignored}}
 int __attribute__((target("arch=hiss,arch=woof"))) pine_tree() { return 4; } //expected-warning {{ignoring unsupported architecture 'hiss' in the target attribute string}}
+// expected-warning at +1 {{'target' attribute ignored}}
 int __attribute__((target("arch=ivybridge,arch=haswell"))) oak_tree() { return 4; } //expected-warning {{ignoring duplicate 'arch=' in the target attribute string}}
 
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43359.134519.patch
Type: text/x-patch
Size: 3974 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180215/325a4775/attachment.bin>


More information about the cfe-commits mailing list