[clang] [CIR] Upstream minimal support for structure types (PR #135105)

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 9 17:46:57 PDT 2025


================
@@ -86,10 +86,80 @@ mlir::Type CIRGenTypes::convertFunctionTypeInternal(QualType qft) {
   return cir::FuncType::get(SmallVector<mlir::Type, 1>{}, cgm.VoidTy);
 }
 
+// This is CIR's version of CodeGenTypes::addRecordTypeName. It isn't shareable
+// because CIR has different uniquing requirements.
+std::string CIRGenTypes::getRecordTypeName(const clang::RecordDecl *recordDecl,
+                                           StringRef suffix) {
+  llvm::SmallString<256> typeName;
+  llvm::raw_svector_ostream outStream(typeName);
+
+  PrintingPolicy policy = recordDecl->getASTContext().getPrintingPolicy();
+  policy.SuppressInlineNamespace = false;
+
+  if (recordDecl->getIdentifier()) {
+    if (recordDecl->getDeclContext())
+      recordDecl->printQualifiedName(outStream, policy);
+    else
+      recordDecl->printName(outStream, policy);
+
+    // Ensure each template specialization has a unique name.
+    if (auto *templateSpecialization =
+            llvm::dyn_cast<ClassTemplateSpecializationDecl>(recordDecl)) {
+      outStream << '<';
+      const ArrayRef<TemplateArgument> args =
+          templateSpecialization->getTemplateArgs().asArray();
+      const auto printer = [&policy, &outStream](const TemplateArgument &arg) {
+        /// Print this template argument to the given output stream.
+        arg.print(policy, outStream, /*IncludeType=*/true);
+      };
+      llvm::interleaveComma(args, outStream, printer);
+      outStream << '>';
+    }
+  } else if (auto *typedefNameDecl = recordDecl->getTypedefNameForAnonDecl()) {
+    if (typedefNameDecl->getDeclContext())
----------------
erichkeane wrote:

Again, a null declcontext just doesn't happen.

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


More information about the cfe-commits mailing list