Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -2445,8 +2445,8 @@ def err_attribute_requires_opencl_version : Error< "%0 attribute requires OpenCL version %1%select{| or above}2">; def warn_unsupported_target_attribute - : Warning<"ignoring %select{unsupported|duplicate}0" - "%select{| architecture}1 '%2' in the target attribute string">, + : Warning<"%select{unsupported|duplicate}0%select{| architecture}1 '%2' in" + " the 'target' attribute string; 'target' attribute ignored">, InGroup; def err_attribute_unsupported : Error<"%0 attribute is not supported for this target">; Index: lib/Sema/SemaDeclAttr.cpp =================================================================== --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -3024,15 +3024,16 @@ << 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)) return; + unsigned Index = AL.getAttributeSpellingListIndex(); TargetAttr *NewAttr = ::new (S.Context) TargetAttr(AL.getRange(), S.Context, Str, Index); 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 @@ -1,14 +1,21 @@ // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify %s int __attribute__((target("avx,sse4.2,arch=ivybridge"))) foo() { return 4; } -int __attribute__((target())) bar() { return 4; } //expected-error {{'target' attribute takes one argument}} -int __attribute__((target("tune=sandybridge"))) baz() { return 4; } //expected-warning {{ignoring unsupported 'tune=' in the target attribute string}} -int __attribute__((target("fpmath=387"))) walrus() { return 4; } //expected-warning {{ignoring unsupported 'fpmath=' in the target attribute string}} -int __attribute__((target("avx,sse4.2,arch=hiss"))) meow() { return 4; }//expected-warning {{ignoring unsupported architecture 'hiss' in the target attribute string}} -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'. -int __attribute__((target("arch=hiss,arch=woof"))) pine_tree() { return 4; } //expected-warning {{ignoring unsupported architecture 'hiss' in the target attribute string}} -int __attribute__((target("arch=ivybridge,arch=haswell"))) oak_tree() { return 4; } //expected-warning {{ignoring duplicate 'arch=' in the target attribute string}} - +//expected-error@+1 {{'target' attribute takes one argument}} +int __attribute__((target())) bar() { return 4; } +//expected-warning@+1 {{unsupported 'tune=' in the 'target' attribute string; 'target' attribute ignored}} +int __attribute__((target("tune=sandybridge"))) baz() { return 4; } +//expected-warning@+1 {{unsupported 'fpmath=' in the 'target' attribute string; 'target' attribute ignored}} +int __attribute__((target("fpmath=387"))) walrus() { return 4; } +//expected-warning@+1 {{unsupported architecture 'hiss' in the 'target' attribute string; 'target' attribute ignored}} +int __attribute__((target("avx,sse4.2,arch=hiss"))) meow() { return 4; } +//expected-warning@+1 {{unsupported 'woof' in the 'target' attribute string; 'target' attribute ignored}} +int __attribute__((target("woof"))) bark() { return 4; } +// no warning, same as saying 'nothing'. +int __attribute__((target("arch="))) turtle() { return 4; } +//expected-warning@+1 {{unsupported architecture 'hiss' in the 'target' attribute string; 'target' attribute ignored}} +int __attribute__((target("arch=hiss,arch=woof"))) pine_tree() { return 4; } +//expected-warning@+1 {{duplicate 'arch=' in the 'target' attribute string; 'target' attribute ignored}} +int __attribute__((target("arch=ivybridge,arch=haswell"))) oak_tree() { return 4; } Index: test/SemaCXX/attr-target-mv.cpp =================================================================== --- test/SemaCXX/attr-target-mv.cpp +++ test/SemaCXX/attr-target-mv.cpp @@ -1,7 +1,7 @@ // 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@+2 {{function multiversioning doesn't support feature 'hello_world'}} -//expected-warning@+1 {{ignoring unsupported 'hello_world' in the target attribute string}} +//expected-error@+2 {{function declaration is missing 'target' attribute in a multiversioned function}} +//expected-warning@+1 {{unsupported 'hello_world' in the 'target' attribute string; 'target' attribute ignored}} void __attribute__((target("hello_world"))) invalid_features(void); //expected-error@+1 {{function multiversioning doesn't support feature 'no-sse4.2'}} void __attribute__((target("no-sse4.2"))) invalid_features(void);