// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This is a "No Compile Test" suite. // http://dev.chromium.org/developers/testing/no-compile-tests #include "base/traits_bag.h" namespace base { enum class RequiredTrait { A, B, C }; struct BooleanTrait {}; struct NotAValidTrait {}; struct TestTraits { // List of traits that are valid inputs for the constructor below. struct ValidTrait { ValidTrait(RequiredTrait); ValidTrait(BooleanTrait); }; template requires trait_helpers::AreValidTraits constexpr TestTraits(ArgTypes... args) : required_trait(trait_helpers::GetEnum(args...)), boolean_trait(trait_helpers::HasTrait()) {} const RequiredTrait required_trait; const bool boolean_trait; }; constexpr TestTraits traits = {}; // expected-error {{constexpr variable 'traits' must be initialized by a constant expression}} // expected-error@base/traits_bag.h:* {{The traits bag is missing a required trait.}} // expected-error@*:* {{no matching constructor for initialization of 'base::trait_helpers::RequiredEnumTraitFilter'}} constexpr TestTraits traits2 = {RequiredTrait::A, NotAValidTrait{}}; // expected-error {{no matching constructor for initialization of 'const TestTraits'}} // expected-error@*:* {{type occurs more than once in type list}} constexpr TestTraits traits3 = {RequiredTrait::A, RequiredTrait::B}; // expected-error {{constexpr variable 'traits3' must be initialized by a constant expression}} // expected-error@base/traits_bag.h:* {{The traits bag contains multiple traits of the same type.}} constexpr TestTraits traits4 = {RequiredTrait::A, BooleanTrait(), // expected-error {{constexpr variable 'traits4' must be initialized by a constant expression}} BooleanTrait()}; // expected-error@base/traits_bag.h:* {{The traits bag contains multiple traits of the same type.}} } // namespace base