[llvm] Add __attribute__((warn_unused_result)) to LLVMErrorRef (PR #87025)

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 28 16:59:04 PDT 2024


https://github.com/dwblaikie created https://github.com/llvm/llvm-project/pull/87025

Sending this out a bit half-baked unfortunately - we added support for
this context a couple of years ago in D102122 (which turned up in clang 15
onwards: https://godbolt.org/z/haz8qrTT3 ), not sure if the macro detection
will correctly detect that the attribute is usable in a typedef context...

Original Differential Revision: https://reviews.llvm.org/D153163


>From d88df4b3870a95f1533dbceec895f1952a297769 Mon Sep 17 00:00:00 2001
From: David Blaikie <dblaikie at gmail.com>
Date: Thu, 2 Jun 2022 23:10:36 +0000
Subject: [PATCH] Add __attribute__((warn_unused_result)) to LLVMErrorRef

Sending this out a bit half-baked unfortunately - we added support for
this context a couple of years ago in D102122 (which turned up in clang 15
onwards: https://godbolt.org/z/haz8qrTT3 ), not sure if the macro detection
will correctly detect that the attribute is usable in a typedef context...

Original Differential Revision: https://reviews.llvm.org/D153163
---
 .../OrcV2CBindingsLazy/OrcV2CBindingsLazy.c    |  2 +-
 .../OrcV2CBindingsVeryLazy.c                   |  6 +++---
 llvm/include/llvm-c/Error.h                    |  2 +-
 llvm/include/llvm-c/ExternC.h                  | 14 ++++++++++++++
 .../ExecutionEngine/Orc/OrcCAPITest.cpp        | 18 +++++++++---------
 5 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsLazy/OrcV2CBindingsLazy.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsLazy/OrcV2CBindingsLazy.c
index c63495a48fd894..34b3806409ca54 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsLazy/OrcV2CBindingsLazy.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsLazy/OrcV2CBindingsLazy.c
@@ -195,7 +195,7 @@ int main(int argc, char *argv[]) {
     LLVMOrcJITDylibRef MainJD = LLVMOrcLLJITGetMainJITDylib(J);
     LLVMOrcMaterializationUnitRef MU =
         LLVMOrcLazyReexports(LCTM, ISM, MainJD, ReExports, 2);
-    LLVMOrcJITDylibDefine(MainJD, MU);
+    (void)LLVMOrcJITDylibDefine(MainJD, MU);
   }
 
   // Look up the address of our demo entry point.
diff --git a/llvm/examples/OrcV2Examples/OrcV2CBindingsVeryLazy/OrcV2CBindingsVeryLazy.c b/llvm/examples/OrcV2Examples/OrcV2CBindingsVeryLazy/OrcV2CBindingsVeryLazy.c
index 864194c2f17fc7..e6e81df4188a0c 100644
--- a/llvm/examples/OrcV2Examples/OrcV2CBindingsVeryLazy/OrcV2CBindingsVeryLazy.c
+++ b/llvm/examples/OrcV2Examples/OrcV2CBindingsVeryLazy/OrcV2CBindingsVeryLazy.c
@@ -220,8 +220,8 @@ int main(int argc, char *argv[]) {
                                                &Materialize, NULL, &Destroy);
 
     LLVMOrcJITDylibRef MainJD = LLVMOrcLLJITGetMainJITDylib(J);
-    LLVMOrcJITDylibDefine(MainJD, FooMU);
-    LLVMOrcJITDylibDefine(MainJD, BarMU);
+    (void)LLVMOrcJITDylibDefine(MainJD, FooMU);
+    (void)LLVMOrcJITDylibDefine(MainJD, BarMU);
   }
 
   // add lazy reexports
@@ -251,7 +251,7 @@ int main(int argc, char *argv[]) {
     LLVMOrcJITDylibRef MainJD = LLVMOrcLLJITGetMainJITDylib(J);
     LLVMOrcMaterializationUnitRef MU =
         LLVMOrcLazyReexports(LCTM, ISM, MainJD, ReExports, 2);
-    LLVMOrcJITDylibDefine(MainJD, MU);
+    (void)LLVMOrcJITDylibDefine(MainJD, MU);
   }
 
   // Look up the address of our demo entry point.
diff --git a/llvm/include/llvm-c/Error.h b/llvm/include/llvm-c/Error.h
index c3baaf65186aac..ef6470efd5b60a 100644
--- a/llvm/include/llvm-c/Error.h
+++ b/llvm/include/llvm-c/Error.h
@@ -30,7 +30,7 @@ LLVM_C_EXTERN_C_BEGIN
 /**
  * Opaque reference to an error instance. Null serves as the 'success' value.
  */
-typedef struct LLVMOpaqueError *LLVMErrorRef;
+LLVM_NODISCARD_TYPEDEF typedef struct LLVMOpaqueError *LLVMErrorRef;
 
 /**
  * Error type identifier.
diff --git a/llvm/include/llvm-c/ExternC.h b/llvm/include/llvm-c/ExternC.h
index dfa21bdc085723..4d3033ef3b3126 100644
--- a/llvm/include/llvm-c/ExternC.h
+++ b/llvm/include/llvm-c/ExternC.h
@@ -36,4 +36,18 @@
 #define LLVM_C_EXTERN_C_END LLVM_C_STRICT_PROTOTYPES_END
 #endif
 
+#ifndef LLVM_HAS_ATTRIBUTE
+#if defined(__has_attribute)
+#define LLVM_HAS_ATTRIBUTE(x) __has_attribute(x)
+#else
+#define LLVM_HAS_ATTRIBUTE(x) 0
+#endif
+#endif
+
+#if LLVM_HAS_ATTRIBUTE(warn_unused_result) && defined(__clang__)
+#define LLVM_NODISCARD_TYPEDEF __attribute__((warn_unused_result))
+#else
+#define LLVM_NODISCARD_TYPEDEF
+#endif
+
 #endif
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
index cbdd4af47e1d47..ab5330d2fa26ee 100644
--- a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
@@ -84,7 +84,7 @@ class OrcCAPITestBase : public testing::Test {
       return;
     }
 
-    LLVMOrcDisposeLLJIT(J);
+    (void)LLVMOrcDisposeLLJIT(J);
     TargetSupported = true;
   }
 
@@ -110,7 +110,7 @@ class OrcCAPITestBase : public testing::Test {
     // Check whether Jit has already been torn down -- we allow clients to do
     // this manually to check teardown behavior.
     if (Jit) {
-      LLVMOrcDisposeLLJIT(Jit);
+      (void)LLVMOrcDisposeLLJIT(Jit);
       Jit = nullptr;
     }
   }
@@ -441,7 +441,7 @@ TEST_F(OrcCAPITestBase, ResourceTrackerDefinitionLifetime) {
     FAIL() << "Symbol \"sum\" was not added into JIT (triple = " << TargetTriple
            << "): " << toString(E);
   ASSERT_TRUE(!!TestFnAddr);
-  LLVMOrcResourceTrackerRemove(RT);
+  (void)LLVMOrcResourceTrackerRemove(RT);
   LLVMOrcJITTargetAddress OutAddr;
   LLVMErrorRef Err = LLVMOrcLLJITLookup(Jit, &OutAddr, "sum");
   ASSERT_TRUE(Err);
@@ -576,7 +576,7 @@ void Materialize(void *Ctx, LLVMOrcMaterializationResponsibilityRef MR) {
       {OtherSymbol, Flags},
       {DependencySymbol, Flags},
   };
-  LLVMOrcMaterializationResponsibilityDefineMaterializing(MR, NewSymbols, 2);
+  (void)LLVMOrcMaterializationResponsibilityDefineMaterializing(MR, NewSymbols, 2);
 
   LLVMOrcRetainSymbolStringPoolEntry(OtherSymbol);
   LLVMOrcMaterializationResponsibilityRef OtherMR = NULL;
@@ -636,13 +636,13 @@ void Materialize(void *Ctx, LLVMOrcMaterializationResponsibilityRef MR) {
 
   // See FIXME above
   LLVMOrcCSymbolMapPair Pair = {DependencySymbol, Sym};
-  LLVMOrcMaterializationResponsibilityNotifyResolved(MR, &Pair, 1);
+  (void)LLVMOrcMaterializationResponsibilityNotifyResolved(MR, &Pair, 1);
   // DependencySymbol no longer owned by us
 
   Pair = {TargetSym.Name, Sym};
-  LLVMOrcMaterializationResponsibilityNotifyResolved(MR, &Pair, 1);
+  (void)LLVMOrcMaterializationResponsibilityNotifyResolved(MR, &Pair, 1);
 
-  LLVMOrcMaterializationResponsibilityNotifyEmitted(MR);
+  (void)LLVMOrcMaterializationResponsibilityNotifyEmitted(MR);
   LLVMOrcDisposeMaterializationResponsibility(MR);
 }
 
@@ -655,7 +655,7 @@ TEST_F(OrcCAPITestBase, MaterializationResponsibility) {
   LLVMOrcMaterializationUnitRef MU = LLVMOrcCreateCustomMaterializationUnit(
       "MU", (void *)Jit, &Sym, 1, NULL, &Materialize, NULL, &Destroy);
   LLVMOrcJITDylibRef JD = LLVMOrcLLJITGetMainJITDylib(Jit);
-  LLVMOrcJITDylibDefine(JD, MU);
+  (void)LLVMOrcJITDylibDefine(JD, MU);
 
   LLVMOrcJITTargetAddress Addr;
   if (LLVMErrorRef Err = LLVMOrcLLJITLookup(Jit, &Addr, "foo")) {
@@ -777,7 +777,7 @@ TEST_F(OrcCAPITestBase, SuspendedLookup) {
   LLVMOrcReleaseSymbolStringPoolEntry(Ctx.NameToGenerate);
 
   // Explicitly tear down the JIT.
-  LLVMOrcDisposeLLJIT(Jit);
+  (void)LLVMOrcDisposeLLJIT(Jit);
   Jit = nullptr;
 
   // Check that the generator context was "destroyed".



More information about the llvm-commits mailing list