From ba87fcd84b24d16b998663b8b48b4a4d464ed66c Mon Sep 17 00:00:00 2001 From: Josh Haberman Date: Sat, 30 Aug 2014 13:09:36 -0700 Subject: Fix in test_cpp for bad macro expansion. --- tests/test_cpp.cc | 117 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 48 deletions(-) (limited to 'tests/test_cpp.cc') diff --git a/tests/test_cpp.cc b/tests/test_cpp.cc index 227fc96..55bb4b3 100644 --- a/tests/test_cpp.cc +++ b/tests/test_cpp.cc @@ -795,18 +795,39 @@ void DoNothingInt32Handler(C* closure, int32_t val) { UPB_UNUSED(val); } -template -R* DoNothingStartHandler(C* closure) { - UPB_UNUSED(closure); - return NULL; -} +template +class DoNothingStartHandler { + public: + // We wrap these functions inside of a class for a somewhat annoying reason. + // UpbMakeHandler() is a macro, so we can't say + // UpbMakeHandler(DoNothingStartHandler) + // + // because otherwise the preprocessor gets confused at the comma and tries to + // make it two macro arguments. The usual solution doesn't work either: + // UpbMakeHandler((DoNothingStartHandler)) + // + // If we do that the macro expands correctly, but then it tries to pass that + // parenthesized expression as a template parameter, ie. Type<(F)>, which + // isn't legal C++ (Clang will compile it but complains with + // warning: address non-type template argument cannot be surrounded by + // parentheses + // + // This two-level thing allows us to effectively pass two template parameters, + // but without any commas: + // UpbMakeHandler(DoNothingStartHandler::Handler) + template + static R* Handler(C* closure) { + UPB_UNUSED(closure); + return NULL; + } -template -R* DoNothingStartStringHandler(C* closure, size_t size_len) { - UPB_UNUSED(closure); - UPB_UNUSED(size_len); - return NULL; -} + template + static R* String(C* closure, size_t size_len) { + UPB_UNUSED(closure); + UPB_UNUSED(size_len); + return NULL; + } +}; template void DoNothingStringBufHandler(C* closure, const char *buf, size_t len) { @@ -892,52 +913,52 @@ void TestMismatchedTypes() { h->SetEndMessageHandler(UpbMakeHandler(DoNothingEndMessageHandler))); ASSERT(!h->SetStartStringHandler( - str, UpbMakeHandler((DoNothingStartStringHandler)))); + str, UpbMakeHandler(DoNothingStartHandler::String))); ASSERT(h->SetStartStringHandler( - str, UpbMakeHandler((DoNothingStartStringHandler)))); + str, UpbMakeHandler(DoNothingStartHandler::String))); - ASSERT(!h->SetEndStringHandler(str, UpbMakeHandler((DoNothingHandler)))); - ASSERT(h->SetEndStringHandler(str, UpbMakeHandler((DoNothingHandler)))); + ASSERT(!h->SetEndStringHandler(str, UpbMakeHandler(DoNothingHandler))); + ASSERT(h->SetEndStringHandler(str, UpbMakeHandler(DoNothingHandler))); ASSERT(!h->SetStartSubMessageHandler( - msg, UpbMakeHandler((DoNothingStartHandler)))); + msg, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSubMessageHandler( - msg, UpbMakeHandler((DoNothingStartHandler)))); + msg, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT( - !h->SetEndSubMessageHandler(msg, UpbMakeHandler((DoNothingHandler)))); + !h->SetEndSubMessageHandler(msg, UpbMakeHandler(DoNothingHandler))); ASSERT( - h->SetEndSubMessageHandler(msg, UpbMakeHandler((DoNothingHandler)))); + h->SetEndSubMessageHandler(msg, UpbMakeHandler(DoNothingHandler))); ASSERT(!h->SetStartSequenceHandler( - r_i32, UpbMakeHandler((DoNothingStartHandler)))); + r_i32, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSequenceHandler( - r_i32, UpbMakeHandler((DoNothingStartHandler)))); + r_i32, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(!h->SetEndSequenceHandler( - r_i32, UpbMakeHandler((DoNothingHandler)))); + r_i32, UpbMakeHandler(DoNothingHandler))); ASSERT(h->SetEndSequenceHandler( - r_i32, UpbMakeHandler((DoNothingHandler)))); + r_i32, UpbMakeHandler(DoNothingHandler))); ASSERT(!h->SetStartSequenceHandler( - r_msg, UpbMakeHandler((DoNothingStartHandler)))); + r_msg, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSequenceHandler( - r_msg, UpbMakeHandler((DoNothingStartHandler)))); + r_msg, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(!h->SetEndSequenceHandler( - r_msg, UpbMakeHandler((DoNothingHandler)))); + r_msg, UpbMakeHandler(DoNothingHandler))); ASSERT(h->SetEndSequenceHandler( - r_msg, UpbMakeHandler((DoNothingHandler)))); + r_msg, UpbMakeHandler(DoNothingHandler))); ASSERT(!h->SetStartSequenceHandler( - r_str, UpbMakeHandler((DoNothingStartHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSequenceHandler( - r_str, UpbMakeHandler((DoNothingStartHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(!h->SetEndSequenceHandler( - r_str, UpbMakeHandler((DoNothingHandler)))); + r_str, UpbMakeHandler(DoNothingHandler))); ASSERT(h->SetEndSequenceHandler( - r_str, UpbMakeHandler((DoNothingHandler)))); + r_str, UpbMakeHandler(DoNothingHandler))); // By setting T1 as the return type for the Start* handlers we have // established T1 as the type of the sequence and string frames. @@ -951,23 +972,23 @@ void TestMismatchedTypes() { ASSERT(h->SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler))); ASSERT(!h->SetStartSubMessageHandler( - r_msg, UpbMakeHandler((DoNothingStartHandler)))); + r_msg, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSubMessageHandler( - r_msg, UpbMakeHandler((DoNothingStartHandler)))); + r_msg, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(!h->SetEndSubMessageHandler(r_msg, - UpbMakeHandler((DoNothingHandler)))); + UpbMakeHandler(DoNothingHandler))); ASSERT(h->SetEndSubMessageHandler(r_msg, - UpbMakeHandler((DoNothingHandler)))); + UpbMakeHandler(DoNothingHandler))); ASSERT(!h->SetStartStringHandler( - r_str, UpbMakeHandler((DoNothingStartStringHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::String))); ASSERT(h->SetStartStringHandler( - r_str, UpbMakeHandler((DoNothingStartStringHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::String))); ASSERT( - !h->SetEndStringHandler(r_str, UpbMakeHandler((DoNothingHandler)))); - ASSERT(h->SetEndStringHandler(r_str, UpbMakeHandler((DoNothingHandler)))); + !h->SetEndStringHandler(r_str, UpbMakeHandler(DoNothingHandler))); + ASSERT(h->SetEndStringHandler(r_str, UpbMakeHandler(DoNothingHandler))); ASSERT(!h->SetStringHandler(r_str, UpbMakeHandler(DoNothingStringBufHandler))); @@ -988,9 +1009,9 @@ void TestMismatchedTypes() { // Now setting a StartSequence callback that returns a different type should // fail. ASSERT(!h->SetStartSequenceHandler( - r_i32, UpbMakeHandler((DoNothingStartHandler)))); + r_i32, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSequenceHandler( - r_i32, UpbMakeHandler((DoNothingStartHandler)))); + r_i32, UpbMakeHandler(DoNothingStartHandler::Handler))); // Establish a string frame directly. ASSERT(h->SetStringHandler(r_str, @@ -998,15 +1019,15 @@ void TestMismatchedTypes() { // Fail setting a StartString callback that returns a different type. ASSERT(!h->SetStartStringHandler( - r_str, UpbMakeHandler((DoNothingStartStringHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::String))); ASSERT(h->SetStartStringHandler( - r_str, UpbMakeHandler((DoNothingStartStringHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::String))); // The previous established T1 as the frame for the r_str sequence. ASSERT(!h->SetStartSequenceHandler( - r_str, UpbMakeHandler((DoNothingStartHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::Handler))); ASSERT(h->SetStartSequenceHandler( - r_str, UpbMakeHandler((DoNothingStartHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::Handler))); // Now test for this error that is not caught until freeze time: // Change-of-closure-type implies that a StartSequence or StartString handler @@ -1020,7 +1041,7 @@ void TestMismatchedTypes() { // Establish T2 as closure type of sequence frame. ASSERT( - h->SetInt32Handler(r_i32, UpbMakeHandler((DoNothingInt32Handler)))); + h->SetInt32Handler(r_i32, UpbMakeHandler(DoNothingInt32Handler))); // Now attempt to freeze; this should fail because a StartSequence handler // needs to be registered that takes a T1 and returns a T2. @@ -1029,7 +1050,7 @@ void TestMismatchedTypes() { // Now if we register the necessary StartSequence handler, the freezing should // work. ASSERT(h->SetStartSequenceHandler( - r_i32, UpbMakeHandler((DoNothingStartHandler)))); + r_i32, UpbMakeHandler(DoNothingStartHandler::Handler))); h->ClearError(); ASSERT(h->Freeze(NULL)); @@ -1051,7 +1072,7 @@ void TestMismatchedTypes() { // Now if we register a StartSequence handler it succeeds. ASSERT(h->SetStartSequenceHandler( - r_str, UpbMakeHandler((DoNothingStartHandler)))); + r_str, UpbMakeHandler(DoNothingStartHandler::Handler))); h->ClearError(); ASSERT(h->Freeze(NULL)); -- cgit v1.2.3