Skip to content

MOCK_METHOD macro not working with clang-cl #2490

@Corristo

Description

@Corristo

My environment

  • Windows 10 Pro version 1809 OS build 17763.775
  • cmake 3.12.18081601-MSVC_2
  • cl version 19.16.27034
  • clang-cl versions 7.0.0 (tags/RELEASE_700/final), 8.0.0 (tags/RELEASE_800/final) and 9.0.0 (https://github.com/llvm/llvm-project.git 0399d5a9682b3cef71c653373e38890c63c4c365) (self-built clang from 9.0.0 tag)
  • googletest 1.10.0

Steps to reproduce

  • Start the x64 Native Tools Command Prompt for VS 2017
  • Ensure clang-cl can be found in the PATH
  • While in the top-level googletest directory, try to build using
    mkdir build
    cd build
    cmake -Dgmock_build_tests=ON -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -G "NMake Makefiles" ..
    cmake --build .
    

Error output (truncated)

[ 43%] Building CXX object googlemock/CMakeFiles/gmock-function-mocker_test.dir/test/gmock-function-mocker_test.cc.obj
C:\TEMP\googletest\googlemock\test\gmock-function-mocker_test.cc(127,3): error: static_assert failed
      "(int n) should be enclosed in parentheses."
  MOCK_METHOD(void, VoidReturning, (int n));  // NOLINT
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(43,3): note: expanded from macro
      'MOCK_METHOD'
  GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(82,3): note: expanded from macro
      'GMOCK_PP_VARIADIC_CALL'
  GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(18,30): note: expanded from macro
      'GMOCK_PP_CAT'
#define GMOCK_PP_CAT(_1, _2) GMOCK_PP_INTERNAL_CAT(_1, _2)
                             ^
note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(52,3): note: expanded from macro
      'GMOCK_INTERNAL_MOCK_METHOD_ARG_3'
  GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(55,3): note: expanded from macro
      'GMOCK_INTERNAL_MOCK_METHOD_ARG_4'
  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args);                                   \
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(84,3): note: expanded from macro
      'GMOCK_INTERNAL_ASSERT_PARENTHESIS'
  static_assert(                                  \
  ^
C:\TEMP\googletest\googlemock\test\gmock-function-mocker_test.cc(127,3): error: static_assert failed
      "() should be enclosed in parentheses."
  MOCK_METHOD(void, VoidReturning, (int n));  // NOLINT
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(43,3): note: expanded from macro
      'MOCK_METHOD'
  GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(82,3): note: expanded from macro
      'GMOCK_PP_VARIADIC_CALL'
  GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(18,30): note: expanded from macro
      'GMOCK_PP_CAT'
#define GMOCK_PP_CAT(_1, _2) GMOCK_PP_INTERNAL_CAT(_1, _2)
                             ^
note: (skipping 2 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(52,3): note: expanded from macro
      'GMOCK_INTERNAL_MOCK_METHOD_ARG_3'
  GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(56,3): note: expanded from macro
      'GMOCK_INTERNAL_MOCK_METHOD_ARG_4'
  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec);                                   \
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(84,3): note: expanded from macro
      'GMOCK_INTERNAL_ASSERT_PARENTHESIS'
  static_assert(                                  \
  ^
C:\TEMP\googletest\googlemock\test\gmock-function-mocker_test.cc(127,3): error: static_assert failed
      due to requirement '(0 + 0 + 0 + 0 + 0) == 1' " cannot be recognized as a valid specification modifier."
  MOCK_METHOD(void, VoidReturning, (int n));  // NOLINT
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(43,3): note: expanded from macro
      'MOCK_METHOD'
  GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(82,3): note: expanded from macro
      'GMOCK_PP_VARIADIC_CALL'
  GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(18,30): note: expanded from macro
      'GMOCK_PP_CAT'
#define GMOCK_PP_CAT(_1, _2) GMOCK_PP_INTERNAL_CAT(_1, _2)
                             ^
note: (skipping 6 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(259,32): note: expanded from macro
      'GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1'
  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/internal/gmock-pp.h(256,3): note: expanded from macro
      'GMOCK_PP_INTERNAL_CALL_MACRO'
  _Macro(_i, _Data, _element)
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\TEMP\googletest\googlemock\include\gmock/gmock-function-mocker.h(158,3): note: expanded from macro
      'GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT'
  static_assert(                                                          \
  ^

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions