1*6777b538SAndroid Build Coastguard Worker// Copyright 2016 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// http://dev.chromium.org/developers/testing/no-compile-tests 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker#include "base/metrics/histogram_functions.h" 9*6777b538SAndroid Build Coastguard Worker#include "base/metrics/histogram_macros.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Workernamespace base { 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Workervoid NotEnums() { 14*6777b538SAndroid Build Coastguard Worker // Sample and boundary values must both be enums. 15*6777b538SAndroid Build Coastguard Worker enum EnumA { A }; 16*6777b538SAndroid Build Coastguard Worker enum EnumB { B }; 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker UmaHistogramEnumeration("", A, 2); // expected-error {{no matching function for call to 'UmaHistogramEnumeration'}} 19*6777b538SAndroid Build Coastguard Worker UmaHistogramEnumeration("", 1, B); // expected-error {{no matching function for call to 'UmaHistogramEnumeration'}} 20*6777b538SAndroid Build Coastguard Worker UmaHistogramEnumeration("", 1, 2); // expected-error@*:* {{static assertion failed due to requirement 'std::is_enum_v<int>'}} 21*6777b538SAndroid Build Coastguard Worker} 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Workervoid DifferentEnums() { 24*6777b538SAndroid Build Coastguard Worker // Sample and boundary values must not come from different enums. 25*6777b538SAndroid Build Coastguard Worker enum EnumA { A }; 26*6777b538SAndroid Build Coastguard Worker enum EnumB { B }; 27*6777b538SAndroid Build Coastguard Worker enum class EnumC { C }; 28*6777b538SAndroid Build Coastguard Worker enum class EnumD { D }; 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION("", A, B); // expected-error {{|sample| and |boundary| shouldn't be of different enums}} 31*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION("", A, EnumD::D); // expected-error {{|sample| and |boundary| shouldn't be of different enums}} 32*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION("", EnumC::C, B); // expected-error {{|sample| and |boundary| shouldn't be of different enums}} 33*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION("", EnumC::C, EnumD::D); // expected-error {{|sample| and |boundary| shouldn't be of different enums}} 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker UmaHistogramEnumeration("", A, B); // expected-error {{no matching function for call to 'UmaHistogramEnumeration'}} 36*6777b538SAndroid Build Coastguard Worker} 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Workervoid MaxOutOfRange() { 39*6777b538SAndroid Build Coastguard Worker // Boundaries must be nonnegative and fit in an int. 40*6777b538SAndroid Build Coastguard Worker enum class TypeA { A = -1 }; 41*6777b538SAndroid Build Coastguard Worker enum class TypeB : uint32_t { B = 0xffffffff }; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION("", TypeA::A, TypeA::A); // expected-error {{|boundary| is out of range of HistogramBase::Sample}} 44*6777b538SAndroid Build Coastguard Worker UMA_HISTOGRAM_ENUMERATION("", TypeB::B, TypeB::B); // expected-error {{|boundary| is out of range of HistogramBase::Sample}} 45*6777b538SAndroid Build Coastguard Worker} 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Workervoid NoMaxValue() { 48*6777b538SAndroid Build Coastguard Worker // When boundary is omitted, sample enum must define `kMaxValue`. 49*6777b538SAndroid Build Coastguard Worker enum class NoMax { kVal }; 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker UmaHistogramEnumeration("", NoMax::kVal); // expected-error@*:* {{no member named 'kMaxValue' in 'NoMax'}} 52*6777b538SAndroid Build Coastguard Worker} 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker} // namespace base 55