From 66c37275ea3acb768d371c46c06a91d7052db8a8 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sat, 27 Jan 2018 03:15:13 -0800 Subject: base: Get bitunions to compile on clang 3.8. clang was getting very upset and interpretting a member function pointer as a call to the actual underlying function, and then complaining that it was a non-static function call without an instance. It seems what it was really upset about was that the class who's scope the member function pointer belonged to (the current class) wasn't done being defined. This *should* be ok as far as I can tell, but clang was having none of it. This change reworks how the type of the setter function arguments are determined to work around that limitation. The bitunion test was run with clang++ and g++ and both pass, and I've built gem5.opt for ARM successfully. Change-Id: Ib9351784a897af4867fe08045577e0247334ea11 Reviewed-on: https://gem5-review.googlesource.com/7581 Reviewed-by: Jason Lowe-Power Maintainer: Gabe Black --- src/base/bitunion.hh | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/base/bitunion.hh b/src/base/bitunion.hh index 6e7d223d2..38d10dac3 100644 --- a/src/base/bitunion.hh +++ b/src/base/bitunion.hh @@ -55,26 +55,31 @@ class BitfieldTypeImpl : public Base "Bitfield base class must be empty."); private: - using Base::setter; - template - struct TypeDeducer; + struct TypeDeducer + { + template + struct T; - template - friend class TypeDeducer; + template + struct T + { + typedef Type1 Storage; + typedef Type2 Type; + }; - template - struct TypeDeducer - { - typedef Type1 Storage; - typedef Type2 Type; + struct Wrapper : public Base + { + using Base::setter; + }; + + typedef typename T::Storage Storage; + typedef typename T::Type Type; }; protected: - typedef typename TypeDeducer< - decltype(&BitfieldTypeImpl::setter)>::Storage Storage; - typedef typename TypeDeducer< - decltype(&BitfieldTypeImpl::setter)>::Type Type; + typedef typename TypeDeducer::Storage Storage; + typedef typename TypeDeducer::Type Type; Type getter(const Storage &storage) const = delete; void setter(Storage &storage, Type val) = delete; -- cgit v1.2.3