Files
swift-mirror/lib/ClangImporter/ClangClassTemplateNamePrinter.h
John Hui 0c2c35bdb1 [cxx-interop] Do not cache FRTInfo during NameImporter
0699fd2cfe previously disabled caching
for FRTInfo requests, to prevent stale cache entries keyed on AST nodes
allocated out of transient Clang sub-instances used to build the PCMs
used by Swift/C++ interop. Specifically, NameImporter is used during PCM
building, so requests from NameImporter should not be cached.

6e9a491172 brought back FRTInfo caching
after name lookup was redesigned to eliminate the need for that FRTInfo
during name lookup (it was involved in determining whether C++ methods
need the "__Unsafe" name mangling).

It turns out FRTInfo is needed in one other place during NameImporter,
to determine the template instance name. I did not realize it existed
while working on 6e9a491172.

This patch avoids the stale cache issues by introduces an uncached
FRTInfo API, for use during PCM building.

rdar://184577717
2026-09-06 23:38:56 -07:00

41 lines
1.5 KiB
C++

//===--- ClangClassTemplateNamePrinter.h ------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_CLANG_TEMPLATE_NAME_PRINTER_H
#define SWIFT_CLANG_TEMPLATE_NAME_PRINTER_H
#include "ImportName.h"
#include "swift/AST/ASTContext.h"
#include "clang/AST/DeclTemplate.h"
namespace swift {
namespace importer {
/// Returns a Swift representation of a C++ class template specialization name,
/// e.g. "vector<CWideChar, allocator<CWideChar>>".
///
/// This expands the entire tree of template instantiation names recursively.
/// While printing deep instantiation levels might not increase readability, it
/// is important to do because the C++ templated class names get mangled,
/// therefore they must be unique for different instantiations.
///
/// This function does not instantiate any templates and does not modify the AST
/// in any way.
std::string printClassTemplateSpecializationName(
const clang::ClassTemplateSpecializationDecl *decl,
NameImporter *nameImporter, ImportNameVersion version);
} // namespace importer
} // namespace swift
#endif // SWIFT_CLANG_TEMPLATE_NAME_PRINTER_H