r370261 - Fix always_inline 'target' compatibility check code for Lambdas

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 28 13:59:26 PDT 2019


Author: erichkeane
Date: Wed Aug 28 13:59:25 2019
New Revision: 370261

URL: http://llvm.org/viewvc/llvm-project?rev=370261&view=rev
Log:
Fix always_inline 'target' compatibility check code for Lambdas

The previous version of this used CurFuncDecl in CodeGenFunction,
however this doesn't include lambdas.  However, CurCodeDecl DOES. Switch
the check to use CurCodeDecl so that the actual function being emitted
gets checked, preventing an error in ISEL.

Modified:
    cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
    cfe/trunk/test/CodeGenCXX/target-features-error.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=370261&r1=370260&r2=370261&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Aug 28 13:59:25 2019
@@ -2203,7 +2203,7 @@ void CodeGenFunction::checkTargetFeature
 
   // Get the current enclosing function if it exists. If it doesn't
   // we can't check the target features anyhow.
-  const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl);
+  const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
   if (!FD)
     return;
 

Modified: cfe/trunk/test/CodeGenCXX/target-features-error.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/target-features-error.cpp?rev=370261&r1=370260&r2=370261&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/target-features-error.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/target-features-error.cpp Wed Aug 28 13:59:25 2019
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o -
+// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST1
+// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST2
+// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -verify -o - -DTEST3
 
 struct S {
   __attribute__((always_inline, target("avx512f")))
@@ -9,9 +11,51 @@ struct S {
   void operator()(){ }
 
 };
+__attribute__((always_inline, target("avx512f")))
+void free_func(){}
 
+
+#ifdef TEST1
 void usage(S & s) {
   s.foo(); // expected-error {{'foo' requires target feature 'avx512f'}}
   (void)(int)s; // expected-error {{'operator int' requires target feature 'avx512f'}}
   s(); // expected-error {{'operator()' requires target feature 'avx512f'}}
+  free_func(); // expected-error{{'free_func' requires target feature 'avx512f'}}
+
+}
+#endif
+
+#ifdef TEST2
+__attribute__((target("avx512f")))
+void usage(S & s) {
+  s.foo();
+  (void)(int)s;
+  s();
+
+  [&s] {
+    s.foo();       // expected-error {{'foo' requires target feature 'avx512f'}}
+    (void)(int) s; // expected-error {{'operator int' requires target feature 'avx512f'}}
+    s();           // expected-error {{'operator()' requires target feature 'avx512f'}}
+    free_func();   // expected-error{{'free_func' requires target feature 'avx512f'}}
+  }();
+}
+#endif
+
+#ifdef TEST3
+void usage(S & s) {
+
+  [&s] () __attribute__((target("avx512f"))) {
+    s.foo();
+    (void)(int) s;
+    s();
+    free_func();
+  }();
+
+  [&s] {
+    s.foo();       // expected-error {{'foo' requires target feature 'avx512f'}}
+    (void)(int) s; // expected-error {{'operator int' requires target feature 'avx512f'}}
+    s();           // expected-error {{'operator()' requires target feature 'avx512f'}}
+    free_func();   // expected-error{{'free_func' requires target feature 'avx512f'}}
+  }();
 }
+#endif




More information about the cfe-commits mailing list