[clang] e29eb66 - [Clang] Slightly tweak the code to try to fix a potential codegen issue in #142592
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 3 07:18:43 PDT 2025
Author: Corentin Jabot
Date: 2025-06-03T16:18:17+02:00
New Revision: e29eb6637d6b8ee54f746a9c914304f83309c4ee
URL: https://github.com/llvm/llvm-project/commit/e29eb6637d6b8ee54f746a9c914304f83309c4ee
DIFF: https://github.com/llvm/llvm-project/commit/e29eb6637d6b8ee54f746a9c914304f83309c4ee.diff
LOG: [Clang] Slightly tweak the code to try to fix a potential codegen issue in #142592
Added:
Modified:
clang/include/clang/Lex/Preprocessor.h
clang/lib/Lex/PPExpressions.cpp
clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h
index cab398ad4a865..78be2bd64d61c 100644
--- a/clang/include/clang/Lex/Preprocessor.h
+++ b/clang/include/clang/Lex/Preprocessor.h
@@ -132,7 +132,7 @@ enum class EmbedResult {
struct CXXStandardLibraryVersionInfo {
enum Library { Unknown, LibStdCXX };
Library Lib;
- unsigned Version;
+ std::uint64_t Version;
};
/// Engages in a tight little dance with the lexer to efficiently
@@ -2717,8 +2717,8 @@ class Preprocessor {
std::optional<CXXStandardLibraryVersionInfo> CXXStandardLibraryVersion;
public:
- std::optional<unsigned> getStdLibCxxVersion();
- bool NeedsStdLibCxxWorkaroundBefore(unsigned FixedVersion);
+ std::optional<std::uint64_t> getStdLibCxxVersion();
+ bool NeedsStdLibCxxWorkaroundBefore(std::uint64_t FixedVersion);
private:
//===--------------------------------------------------------------------===//
diff --git a/clang/lib/Lex/PPExpressions.cpp b/clang/lib/Lex/PPExpressions.cpp
index 7b1dbb29b3b24..d18e56e7d478a 100644
--- a/clang/lib/Lex/PPExpressions.cpp
+++ b/clang/lib/Lex/PPExpressions.cpp
@@ -984,14 +984,9 @@ static std::optional<CXXStandardLibraryVersionInfo>
getCXXStandardLibraryVersion(Preprocessor &PP, StringRef MacroName,
CXXStandardLibraryVersionInfo::Library Lib) {
MacroInfo *Macro = PP.getMacroInfo(PP.getIdentifierInfo(MacroName));
- if (!Macro)
+ if (!Macro || Macro->getNumTokens() != 1 || !Macro->isObjectLike())
return std::nullopt;
- if (Macro->getNumTokens() != 1 || !Macro->isObjectLike()) {
- Macro->dump();
- return std::nullopt;
- }
-
const Token &RevisionDateTok = Macro->getReplacementToken(0);
bool Invalid = false;
@@ -999,19 +994,16 @@ getCXXStandardLibraryVersion(Preprocessor &PP, StringRef MacroName,
llvm::StringRef RevisionDate =
PP.getSpelling(RevisionDateTok, Buffer, &Invalid);
if (!Invalid) {
- llvm::errs() << RevisionDate << "\n";
- unsigned Value;
+ std::uint64_t Value;
// We don't use NumericParser to avoid diagnostics
- if (!RevisionDate.consumeInteger(10, Value)) {
- llvm::errs() << "Value:" << Value << "\n";
+ if (!RevisionDate.consumeInteger(10, Value))
return CXXStandardLibraryVersionInfo{Lib, Value};
- }
}
return CXXStandardLibraryVersionInfo{CXXStandardLibraryVersionInfo::Unknown,
0};
}
-std::optional<unsigned> Preprocessor::getStdLibCxxVersion() {
+std::optional<uint64_t> Preprocessor::getStdLibCxxVersion() {
if (!CXXStandardLibraryVersion)
CXXStandardLibraryVersion = getCXXStandardLibraryVersion(
*this, "__GLIBCXX__", CXXStandardLibraryVersionInfo::LibStdCXX);
@@ -1024,10 +1016,10 @@ std::optional<unsigned> Preprocessor::getStdLibCxxVersion() {
return std::nullopt;
}
-bool Preprocessor::NeedsStdLibCxxWorkaroundBefore(unsigned FixedVersion) {
+bool Preprocessor::NeedsStdLibCxxWorkaroundBefore(uint64_t FixedVersion) {
assert(FixedVersion >= 2000'00'00 && FixedVersion <= 2100'00'00 &&
"invalid value for __GLIBCXX__");
- std::optional<unsigned> Ver = getStdLibCxxVersion();
+ std::optional<std::uint64_t> Ver = getStdLibCxxVersion();
if (!Ver)
return false;
return *Ver < FixedVersion;
diff --git a/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp b/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
index 6b0adea930abf..6b8ca4f740914 100644
--- a/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
+++ b/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
@@ -7,15 +7,15 @@
// The same problem afflicts a bunch of other class templates. Those
// affected are array, pair, priority_queue, stack, and queue.
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array -DPR28423
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=pair
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=priority_queue
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=stack
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=queue
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array -DPR28423
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=pair
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=priority_queue
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=stack
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=queue
//
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__debug
-// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__profile
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__debug
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__profile
// MSVC's standard library uses a very similar pattern that relies on delayed
// parsing of exception specifications.
More information about the cfe-commits
mailing list