xref: /aosp_15_r20/external/cronet/base/traits_bag_nocompile.nc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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