[llvm] [clang-cl] Fix friend class warning on Windows (PR #201720)

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 8 16:48:32 PDT 2026


https://github.com/rnk updated https://github.com/llvm/llvm-project/pull/201720

>From eb6cbe5a0fa42a41860be3f1b89a3863dab90226 Mon Sep 17 00:00:00 2001
From: Reid Kleckner <rkleckner at nvidia.com>
Date: Thu, 4 Jun 2026 16:40:51 -0700
Subject: [PATCH 1/2] [clang-cl] Fix friend class warning on Windows

clang-cl warned on "friend class CallInst;" because MSVC may resolve that to "friend llvm::CallInst" instead of the sbox IR mirrored hierarch. Drop the class tag and refer to forward declared names instead.
---
 llvm/include/llvm/SandboxIR/Use.h | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/llvm/include/llvm/SandboxIR/Use.h b/llvm/include/llvm/SandboxIR/Use.h
index db333ddb6e101..ee051554f2b58 100644
--- a/llvm/include/llvm/SandboxIR/Use.h
+++ b/llvm/include/llvm/SandboxIR/Use.h
@@ -22,10 +22,20 @@ namespace llvm::sandboxir {
 class Context;
 class Value;
 class User;
+class OperandUseIterator;
+class UserUseIterator;
 class CallBase;
 class CallBrInst;
 class PHINode;
 
+// Forward declare instruction wrapper classes so qualified friend
+// declarations below refer to SandboxIR classes instead of introducing new
+// unqualified declarations.
+#define DEF_INSTR(ID, OPC, CLASS) class CLASS;
+#define DEF_DISABLE_AUTO_UNDEF // ValuesDefFilesList.def includes multiple .def
+#include "llvm/SandboxIR/ValuesDefFilesList.def"
+#undef DEF_INSTR
+
 /// Represents a Def-use/Use-def edge in SandboxIR.
 /// NOTE: Unlike llvm::Use, this is not an integral part of the use-def chains.
 /// It is also not uniqued and is currently passed by value, so you can have
@@ -40,14 +50,14 @@ class Use {
       : LLVMUse(LLVMUse), Usr(Usr), Ctx(&Ctx) {}
   Use() : LLVMUse(nullptr), Ctx(nullptr) {}
 
-  friend class Value;              // For constructor
-  friend class User;               // For constructor
-  friend class OperandUseIterator; // For constructor
-  friend class UserUseIterator;    // For accessing members
-  friend class CallBase;           // For LLVMUse
-  friend class PHINode;            // For LLVMUse
+  friend class ::llvm::sandboxir::Value;              // For constructor
+  friend class ::llvm::sandboxir::User;               // For constructor
+  friend class ::llvm::sandboxir::OperandUseIterator; // For constructor
+  friend class ::llvm::sandboxir::UserUseIterator;    // For accessing members
+  friend class ::llvm::sandboxir::CallBase;           // For LLVMUse
+  friend class ::llvm::sandboxir::PHINode;            // For LLVMUse
   // Friend instructions so that they can call the constructor if needed.
-#define DEF_INSTR(ID, OPC, CLASS) friend class CLASS;
+#define DEF_INSTR(ID, OPC, CLASS) friend class ::llvm::sandboxir::CLASS;
 #define DEF_DISABLE_AUTO_UNDEF // ValuesDefFilesList.def includes multiple .def
 #include "llvm/SandboxIR/ValuesDefFilesList.def"
 #undef DEF_INSTR

>From 8a4186a9232d3eda8cebbc2e6e408e845fb5faff Mon Sep 17 00:00:00 2001
From: Reid Kleckner <rkleckner at nvidia.com>
Date: Mon, 8 Jun 2026 16:47:21 -0700
Subject: [PATCH 2/2] Remove class tag

---
 llvm/include/llvm/SandboxIR/Use.h | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/llvm/include/llvm/SandboxIR/Use.h b/llvm/include/llvm/SandboxIR/Use.h
index ee051554f2b58..5b024b81e327c 100644
--- a/llvm/include/llvm/SandboxIR/Use.h
+++ b/llvm/include/llvm/SandboxIR/Use.h
@@ -50,14 +50,14 @@ class Use {
       : LLVMUse(LLVMUse), Usr(Usr), Ctx(&Ctx) {}
   Use() : LLVMUse(nullptr), Ctx(nullptr) {}
 
-  friend class ::llvm::sandboxir::Value;              // For constructor
-  friend class ::llvm::sandboxir::User;               // For constructor
-  friend class ::llvm::sandboxir::OperandUseIterator; // For constructor
-  friend class ::llvm::sandboxir::UserUseIterator;    // For accessing members
-  friend class ::llvm::sandboxir::CallBase;           // For LLVMUse
-  friend class ::llvm::sandboxir::PHINode;            // For LLVMUse
+  friend ::llvm::sandboxir::Value;              // For constructor
+  friend ::llvm::sandboxir::User;               // For constructor
+  friend ::llvm::sandboxir::OperandUseIterator; // For constructor
+  friend ::llvm::sandboxir::UserUseIterator;    // For accessing members
+  friend ::llvm::sandboxir::CallBase;           // For LLVMUse
+  friend ::llvm::sandboxir::PHINode;            // For LLVMUse
   // Friend instructions so that they can call the constructor if needed.
-#define DEF_INSTR(ID, OPC, CLASS) friend class ::llvm::sandboxir::CLASS;
+#define DEF_INSTR(ID, OPC, CLASS) friend ::llvm::sandboxir::CLASS;
 #define DEF_DISABLE_AUTO_UNDEF // ValuesDefFilesList.def includes multiple .def
 #include "llvm/SandboxIR/ValuesDefFilesList.def"
 #undef DEF_INSTR



More information about the llvm-commits mailing list