Bug 1313551 - fix the traling return type of StateObject::SetState() so it can be indexed correctly by Eclipse.
MozReview-Commit-ID: 8FQuSJ0pgrB
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -218,29 +218,33 @@ public:
virtual void HandleVideoSuspendTimeout() = 0;
virtual void HandleResumeVideoDecoding();
virtual void HandlePlayStateChanged(MediaDecoder::PlayState aPlayState) {}
virtual void DumpDebugInfo() {}
+private:
+ template <class S, typename R, typename... As>
+ auto ReturnTypeHelper(R(S::*)(As...)) -> R;
+
protected:
using Master = MediaDecoderStateMachine;
explicit StateObject(Master* aPtr) : mMaster(aPtr) {}
TaskQueue* OwnerThread() const { return mMaster->mTaskQueue; }
MediaResource* Resource() const { return mMaster->mResource; }
MediaDecoderReaderWrapper* Reader() const { return mMaster->mReader; }
const MediaInfo& Info() const { return mMaster->Info(); }
// Note this function will delete the current state object.
// Don't access members to avoid UAF after this call.
template <class S, typename... Ts>
auto SetState(Ts... aArgs)
- -> decltype(DeclVal<S>().Enter(Move(aArgs)...))
+ -> decltype(ReturnTypeHelper(&S::Enter))
{
// keep mMaster in a local object because mMaster will become invalid after
// the current state object is deleted.
auto master = mMaster;
auto s = new S(master);
MOZ_ASSERT(master->mState != s->GetState() ||