1*6777b538SAndroid Build Coastguard Worker// Copyright 2019 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker// This is a "No Compile Test" suite. 6*6777b538SAndroid Build Coastguard Worker// https://dev.chromium.org/developers/testing/no-compile-tests 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker#include "base/sequence_checker.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Workernamespace { 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workerclass SequenceAffine { 13*6777b538SAndroid Build Coastguard Worker public: 14*6777b538SAndroid Build Coastguard Worker void BuggyCounterAccess(); 15*6777b538SAndroid Build Coastguard Worker void BuggyIncrementCall(); 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker void Increment() VALID_CONTEXT_REQUIRED(sequence_checker_) { 18*6777b538SAndroid Build Coastguard Worker ++counter_; 19*6777b538SAndroid Build Coastguard Worker } 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker private: 22*6777b538SAndroid Build Coastguard Worker int counter_ GUARDED_BY_CONTEXT(sequence_checker_); 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 25*6777b538SAndroid Build Coastguard Worker}; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker#if DCHECK_IS_ON() 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Workervoid SequenceAffine::BuggyCounterAccess() { 30*6777b538SAndroid Build Coastguard Worker // Member access without sequence_checker_ assertion. 31*6777b538SAndroid Build Coastguard Worker ++counter_; // expected-error {{writing variable 'counter_' requires holding context 'sequence_checker_' exclusively}} 32*6777b538SAndroid Build Coastguard Worker} 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Workervoid SequenceAffine::BuggyIncrementCall() { 35*6777b538SAndroid Build Coastguard Worker // Function call without sequence_checker_ assertion. 36*6777b538SAndroid Build Coastguard Worker Increment(); // expected-error {{calling function 'Increment' requires holding context 'sequence_checker_' exclusively}} 37*6777b538SAndroid Build Coastguard Worker} 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker#else 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker// The SEQUENCE_CHECKER macros only do something in DCHECK builds. 42*6777b538SAndroid Build Coastguard Worker// expected-no-diagnostics 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker#endif 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker} // namespace 47