[clang] [Clang] Add fake use emission to Clang with -fextend-lifetimes (PR #110102)

Stephen Tozer via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 25 07:05:34 PST 2024


================
@@ -0,0 +1,43 @@
+// RUN: %clang_cc1 %s -triple=%itanium_abi_triple -O1 -emit-llvm -fextend-lifetimes -o - | FileCheck %s
+// Make sure we don't crash compiling a lambda that is not nested in a function.
+// We also check that fake uses are properly issued in lambdas.
+
+int glob;
+
+extern int foo();
+
+struct S {
+  static const int a;
+};
+
+const int S::a = [](int b) __attribute__((noinline)) {
+  return b * foo();
+}
+(glob);
+
+int func(int param) {
+  return ([=](int lambdaparm) __attribute__((noinline))->int {
+    int lambdalocal = lambdaparm * 2;
+    return lambdalocal;
+  }(glob));
+}
+
+// We are looking for the first lambda's call operator, which should contain
+// 2 fake uses, one for 'b' and one for its 'this' pointer (in that order).
+// The mangled function name contains a $_0, followed by 'cl'.
+// This lambda is an orphaned lambda, i.e. one without lexical parent.
+//
+// CHECK:     define internal {{.+\"_Z.+\$_0.*cl.*\"}}
+// CHECK-NOT: ret
+// CHECK:     fake.use(i32
+// CHECK-NOT: ret
+// CHECK:     fake.use(ptr
----------------
SLTozer wrote:

Not quite - as there are other functions in this file, the fake.uses could be in a different function between the two that we have `CHECK-LABEL` directives for; this could be done by adding more check lines for the other functions, but I think this is _slightly_ simpler - happy to change it if you think otherwise though.

https://github.com/llvm/llvm-project/pull/110102


More information about the cfe-commits mailing list