[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