r322530 - [Sema] Fix a crash on invalid features in multiversioning

George Burgess IV via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 15 19:01:50 PST 2018


Author: gbiv
Date: Mon Jan 15 19:01:50 2018
New Revision: 322530

URL: http://llvm.org/viewvc/llvm-project?rev=322530&view=rev
Log:
[Sema] Fix a crash on invalid features in multiversioning

We were trying to emit a diag::err_bad_multiversion_option diagnostic,
which expects an int as its first argument, with a string argument. As
it happens, the string `Feature` that was causing this was shadowing an
int `Feature` from the surrounding scope. :)

Modified:
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/test/SemaCXX/attr-target-mv.cpp

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=322530&r1=322529&r2=322530&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Jan 15 19:01:50 2018
@@ -9175,9 +9175,9 @@ static bool CheckMultiVersionValue(Sema
     return true;
   }
 
-  for (const auto &Feature : ParseInfo.Features) {
-    auto BareFeat = StringRef{Feature}.substr(1);
-    if (Feature[0] == '-') {
+  for (const auto &Feat : ParseInfo.Features) {
+    auto BareFeat = StringRef{Feat}.substr(1);
+    if (Feat[0] == '-') {
       S.Diag(FD->getLocation(), diag::err_bad_multiversion_option)
           << Feature << ("no-" + BareFeat).str();
       return true;

Modified: cfe/trunk/test/SemaCXX/attr-target-mv.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-target-mv.cpp?rev=322530&r1=322529&r2=322530&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/attr-target-mv.cpp (original)
+++ cfe/trunk/test/SemaCXX/attr-target-mv.cpp Mon Jan 15 19:01:50 2018
@@ -1,4 +1,11 @@
 // 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}}
+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);
+
 void __attribute__((target("sse4.2"))) no_default(void);
 void __attribute__((target("arch=sandybridge")))  no_default(void);
 




More information about the cfe-commits mailing list