1*6777b538SAndroid Build Coastguard Worker// Copyright 2018 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/traits_bag.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Workernamespace base { 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Workerenum class RequiredTrait { 13*6777b538SAndroid Build Coastguard Worker A, 14*6777b538SAndroid Build Coastguard Worker B, 15*6777b538SAndroid Build Coastguard Worker C 16*6777b538SAndroid Build Coastguard Worker}; 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Workerstruct BooleanTrait {}; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Workerstruct NotAValidTrait {}; 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Workerstruct TestTraits { 23*6777b538SAndroid Build Coastguard Worker // List of traits that are valid inputs for the constructor below. 24*6777b538SAndroid Build Coastguard Worker struct ValidTrait { 25*6777b538SAndroid Build Coastguard Worker ValidTrait(RequiredTrait); 26*6777b538SAndroid Build Coastguard Worker ValidTrait(BooleanTrait); 27*6777b538SAndroid Build Coastguard Worker }; 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker template <class... ArgTypes> 30*6777b538SAndroid Build Coastguard Worker requires trait_helpers::AreValidTraits<ValidTrait, ArgTypes...> 31*6777b538SAndroid Build Coastguard Worker constexpr TestTraits(ArgTypes... args) 32*6777b538SAndroid Build Coastguard Worker : required_trait(trait_helpers::GetEnum<RequiredTrait>(args...)), 33*6777b538SAndroid Build Coastguard Worker boolean_trait(trait_helpers::HasTrait<BooleanTrait, ArgTypes...>()) {} 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker const RequiredTrait required_trait; 36*6777b538SAndroid Build Coastguard Worker const bool boolean_trait; 37*6777b538SAndroid Build Coastguard Worker}; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Workerconstexpr TestTraits traits = {}; // expected-error {{constexpr variable 'traits' must be initialized by a constant expression}} 40*6777b538SAndroid Build Coastguard Worker // expected-error@base/traits_bag.h:* {{The traits bag is missing a required trait.}} 41*6777b538SAndroid Build Coastguard Worker // expected-error@*:* {{no matching constructor for initialization of 'base::trait_helpers::RequiredEnumTraitFilter<base::RequiredTrait>'}} 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Workerconstexpr TestTraits traits2 = {RequiredTrait::A, NotAValidTrait{}}; // expected-error {{no matching constructor for initialization of 'const TestTraits'}} 44*6777b538SAndroid Build Coastguard Worker // expected-error@*:* {{type occurs more than once in type list}} 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Workerconstexpr TestTraits traits3 = {RequiredTrait::A, RequiredTrait::B}; // expected-error {{constexpr variable 'traits3' must be initialized by a constant expression}} 47*6777b538SAndroid Build Coastguard Worker // expected-error@base/traits_bag.h:* {{The traits bag contains multiple traits of the same type.}} 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Workerconstexpr TestTraits traits4 = {RequiredTrait::A, BooleanTrait(), // expected-error {{constexpr variable 'traits4' must be initialized by a constant expression}} 50*6777b538SAndroid Build Coastguard Worker BooleanTrait()}; // expected-error@base/traits_bag.h:* {{The traits bag contains multiple traits of the same type.}} 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker} // namespace base 53