make WithParamInterface<T>::GetParam static #1830
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The decision for GetParam to be non-static can lead to order dependencies in multiple inheritance cases for otherwise normal usage.
As an example from libvpx we have
#define GET_PARAM(k) std::tr1::get< k >(GetParam())
template<class T1, class T2>
class CodecTestWith2Params : public ::testing::TestWithParam<
std::tr1::tuple< const libvpx_test::CodecFactory*, T1, T2 > > {
};
...
class ActiveMapTest
: public ::libvpx_test::EncoderTest,
public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
...
ActiveMapTest() : EncoderTest(GET_PARAM(0)) {}
here GetParam is called before the TestWithParam subobject has begun construction. This is, of course, undefined behaviour (and the address-sanitizer will complain). The problem can be avoided by changing the order of inheritance. But this seems to be a rather artificial restriction which does not necessarily weigh less than the desire to avoid mistakes that were meant to be prevented by making GetParam non-static.