-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[Support] Use macro var args to allow templates within DEBUG_WITH_TYPE #117614
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Support] Use macro var args to allow templates within DEBUG_WITH_TYPE #117614
Conversation
@llvm/pr-subscribers-llvm-support Author: Tyler Nowicki (TylerNowicki) ChangesUsing a comma within a DEBUG_WITH_TYPE("name", {...}) block will result in compilation failure. This can be resolved by using variadic args. Commas come up when instantiating templates such as SmallMapVector that require multiple template args. Full diff: https://github.com/llvm/llvm-project/pull/117614.diff 2 Files Affected:
diff --git a/llvm/include/llvm/Support/Debug.h b/llvm/include/llvm/Support/Debug.h
index 3e2f0d9b43fc0d..c16327033e549a 100644
--- a/llvm/include/llvm/Support/Debug.h
+++ b/llvm/include/llvm/Support/Debug.h
@@ -61,15 +61,15 @@ void setCurrentDebugTypes(const char **Types, unsigned Count);
///
/// This will emit the debug information if -debug is present, and -debug-only
/// is not specified, or is specified as "bitset".
-#define DEBUG_WITH_TYPE(TYPE, X) \
- do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType(TYPE)) { X; } \
+#define DEBUG_WITH_TYPE(TYPE, ...) \
+ do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType(TYPE)) { __VA_ARGS__; } \
} while (false)
#else
#define isCurrentDebugType(X) (false)
#define setCurrentDebugType(X) do { (void)(X); } while (false)
#define setCurrentDebugTypes(X, N) do { (void)(X); (void)(N); } while (false)
-#define DEBUG_WITH_TYPE(TYPE, X) do { } while (false)
+#define DEBUG_WITH_TYPE(TYPE, ...) do { } while (false)
#endif
/// This boolean is set to true if the '-debug' command line option
@@ -98,7 +98,7 @@ raw_ostream &dbgs();
//
// LLVM_DEBUG(dbgs() << "Bitset contains: " << Bitset << "\n");
//
-#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
+#define LLVM_DEBUG(...) DEBUG_WITH_TYPE(DEBUG_TYPE, __VA_ARGS__)
} // end namespace llvm
diff --git a/llvm/unittests/Support/DebugTest.cpp b/llvm/unittests/Support/DebugTest.cpp
index e68e3764b43839..9e4b6e8665ad56 100644
--- a/llvm/unittests/Support/DebugTest.cpp
+++ b/llvm/unittests/Support/DebugTest.cpp
@@ -6,7 +6,9 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/MapVector.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"
@@ -30,4 +32,22 @@ TEST(DebugTest, Basic) {
DEBUG_WITH_TYPE("B", os2 << "B");
EXPECT_EQ("A", os2.str());
}
+
+TEST(DebugTest, CommaInDebugBlock) {
+ std::string s1, s2;
+ raw_string_ostream os1(s1), os2(s2);
+ static const char *DT[] = {"A", "B"};
+ static const char Letters[] = {'X', 'Y', 'Z'};
+
+ llvm::DebugFlag = true;
+ setCurrentDebugTypes(DT, 2);
+ DEBUG_WITH_TYPE("A", {
+ SmallMapVector <int, char, 4> map;
+ for (int i = 0; i < 3; i++)
+ map[i] = Letters[i];
+ for (int i = 2; i >= 0; i--)
+ os1 << map[i];
+ });
+ EXPECT_EQ("ZYX", os1.str());
+}
#endif
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/190/builds/10766 Here is the relevant piece of the build log for the reference
|
Use variadic args with DEBUG_WITH_TYPE("name", ...) macros to resolve a compilation failure that occurs when using a comma within the last macro argument. Commas come up when instantiating templates such as SmallMapVector that require multiple template args.