Skip to content

Commit e29eb66

Browse files
committed
[Clang] Slightly tweak the code to try to fix a potential codegen issue in #142592
1 parent bb75f65 commit e29eb66

File tree

3 files changed

+17
-25
lines changed

3 files changed

+17
-25
lines changed

clang/include/clang/Lex/Preprocessor.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ enum class EmbedResult {
132132
struct CXXStandardLibraryVersionInfo {
133133
enum Library { Unknown, LibStdCXX };
134134
Library Lib;
135-
unsigned Version;
135+
std::uint64_t Version;
136136
};
137137

138138
/// Engages in a tight little dance with the lexer to efficiently
@@ -2717,8 +2717,8 @@ class Preprocessor {
27172717
std::optional<CXXStandardLibraryVersionInfo> CXXStandardLibraryVersion;
27182718

27192719
public:
2720-
std::optional<unsigned> getStdLibCxxVersion();
2721-
bool NeedsStdLibCxxWorkaroundBefore(unsigned FixedVersion);
2720+
std::optional<std::uint64_t> getStdLibCxxVersion();
2721+
bool NeedsStdLibCxxWorkaroundBefore(std::uint64_t FixedVersion);
27222722

27232723
private:
27242724
//===--------------------------------------------------------------------===//

clang/lib/Lex/PPExpressions.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -984,34 +984,26 @@ static std::optional<CXXStandardLibraryVersionInfo>
984984
getCXXStandardLibraryVersion(Preprocessor &PP, StringRef MacroName,
985985
CXXStandardLibraryVersionInfo::Library Lib) {
986986
MacroInfo *Macro = PP.getMacroInfo(PP.getIdentifierInfo(MacroName));
987-
if (!Macro)
987+
if (!Macro || Macro->getNumTokens() != 1 || !Macro->isObjectLike())
988988
return std::nullopt;
989989

990-
if (Macro->getNumTokens() != 1 || !Macro->isObjectLike()) {
991-
Macro->dump();
992-
return std::nullopt;
993-
}
994-
995990
const Token &RevisionDateTok = Macro->getReplacementToken(0);
996991

997992
bool Invalid = false;
998993
llvm::SmallVector<char, 10> Buffer;
999994
llvm::StringRef RevisionDate =
1000995
PP.getSpelling(RevisionDateTok, Buffer, &Invalid);
1001996
if (!Invalid) {
1002-
llvm::errs() << RevisionDate << "\n";
1003-
unsigned Value;
997+
std::uint64_t Value;
1004998
// We don't use NumericParser to avoid diagnostics
1005-
if (!RevisionDate.consumeInteger(10, Value)) {
1006-
llvm::errs() << "Value:" << Value << "\n";
999+
if (!RevisionDate.consumeInteger(10, Value))
10071000
return CXXStandardLibraryVersionInfo{Lib, Value};
1008-
}
10091001
}
10101002
return CXXStandardLibraryVersionInfo{CXXStandardLibraryVersionInfo::Unknown,
10111003
0};
10121004
}
10131005

1014-
std::optional<unsigned> Preprocessor::getStdLibCxxVersion() {
1006+
std::optional<uint64_t> Preprocessor::getStdLibCxxVersion() {
10151007
if (!CXXStandardLibraryVersion)
10161008
CXXStandardLibraryVersion = getCXXStandardLibraryVersion(
10171009
*this, "__GLIBCXX__", CXXStandardLibraryVersionInfo::LibStdCXX);
@@ -1024,10 +1016,10 @@ std::optional<unsigned> Preprocessor::getStdLibCxxVersion() {
10241016
return std::nullopt;
10251017
}
10261018

1027-
bool Preprocessor::NeedsStdLibCxxWorkaroundBefore(unsigned FixedVersion) {
1019+
bool Preprocessor::NeedsStdLibCxxWorkaroundBefore(uint64_t FixedVersion) {
10281020
assert(FixedVersion >= 2000'00'00 && FixedVersion <= 2100'00'00 &&
10291021
"invalid value for __GLIBCXX__");
1030-
std::optional<unsigned> Ver = getStdLibCxxVersion();
1022+
std::optional<std::uint64_t> Ver = getStdLibCxxVersion();
10311023
if (!Ver)
10321024
return false;
10331025
return *Ver < FixedVersion;

clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
// The same problem afflicts a bunch of other class templates. Those
88
// affected are array, pair, priority_queue, stack, and queue.
99

10-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array
11-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array -DPR28423
12-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=pair
13-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=priority_queue
14-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=stack
15-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=queue
10+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array
11+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array -DPR28423
12+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=pair
13+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=priority_queue
14+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=stack
15+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=queue
1616
//
17-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__debug
18-
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -Wextra -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__profile
17+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__debug
18+
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -D__GLIBCXX__=20100000L -DCLASS=array -DNAMESPACE=__profile
1919

2020
// MSVC's standard library uses a very similar pattern that relies on delayed
2121
// parsing of exception specifications.

0 commit comments

Comments
 (0)