summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Support/ErrnoTest.cpp
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2017-06-22 13:55:54 +0000
committerPavel Labath <labath@google.com>2017-06-22 13:55:54 +0000
commitfafedb11cea07375b55ea900132d19b1970662d3 (patch)
treef5e3a9651f7c89e1eb591645887fa10125184552 /llvm/unittests/Support/ErrnoTest.cpp
parent25374a6849fa232169ce876d4bf18e0f4c99ef06 (diff)
downloadbcm5719-llvm-fafedb11cea07375b55ea900132d19b1970662d3.tar.gz
bcm5719-llvm-fafedb11cea07375b55ea900132d19b1970662d3.zip
[Support] Fix return type deduction in RetryAfterSignal
The default value of the ResultT template argument (which was there only to avoid spelling out the long std::result_of template multiple times) was being overriden by function call template argument deduction. This manifested itself as a compiler error when calling the function as FILE *X = RetryAfterSignal(nullptr, fopen, ...) because the function would try to assign the result of fopen to nullptr_t, but a more insidious side effect was that RetryAfterSignal(-1, read, ...) would return "int" instead of "ssize_t", losing precision along the way. I fix this by having the function take the argument in a way that prevents argument deduction from kicking in and add a test that makes sure the return type is correct. llvm-svn: 306003
Diffstat (limited to 'llvm/unittests/Support/ErrnoTest.cpp')
-rw-r--r--llvm/unittests/Support/ErrnoTest.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/unittests/Support/ErrnoTest.cpp b/llvm/unittests/Support/ErrnoTest.cpp
index 72b52c01ee3..888c162822d 100644
--- a/llvm/unittests/Support/ErrnoTest.cpp
+++ b/llvm/unittests/Support/ErrnoTest.cpp
@@ -12,6 +12,8 @@
using namespace llvm::sys;
+static int *ReturnPointer() { return new int(47); }
+
TEST(ErrnoTest, RetryAfterSignal) {
EXPECT_EQ(1, RetryAfterSignal(-1, [] { return 1; }));
@@ -30,4 +32,7 @@ TEST(ErrnoTest, RetryAfterSignal) {
EXPECT_EQ(2u, calls);
EXPECT_EQ(1, RetryAfterSignal(-1, [](int x) { return x; }, 1));
+
+ std::unique_ptr<int> P{RetryAfterSignal(nullptr, ReturnPointer)};
+ EXPECT_EQ(47, *P);
}
OpenPOWER on IntegriCloud