p4.cpp revision 7c5d28b6342229fb648aea59dc063f67ff16bc81
15faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
25faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
35faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename... Types> struct tuple;
45faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<int I> struct int_c;
55faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
65faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename T>
75faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct identity {
85faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  typedef T type;
95faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
118b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgtemplate<typename T, typename U>
128b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgstruct is_same {
135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  static const bool value = false;
148640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org};
155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
163bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.orgtemplate<typename T>
17d698f77c13d97c61109b861eac4d25b14a5de935bsalomon@google.comstruct is_same<T, T> {
18dbe49f735484f8862e378b63d0a074a301093dd0bsalomon@google.com  static const bool value = true;
192eaaefd7e6a58339b3f93333f1e9cc92252cc303bsalomon@google.com};
2017fc651dbe2e0624f6c85fb6e081d28a87d5a08bbsalomon@google.com
2117fc651dbe2e0624f6c85fb6e081d28a87d5a08bbsalomon@google.com// FIXME: Several more bullets to go
223bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org
233bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org// In a function parameter pack, the pattern is the parameter-declaration
24c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org// without the ellipsis.
25c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgnamespace PR11850 {
26c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  template<typename ...T> struct S {
27c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org    int f(T...a, int b) { return b; }
28c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  };
29c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  S<> s;
30c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  S<int*, char, const double&> t;
31c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  int k = s.f(0);
32c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  int l = t.f(&k, 'x', 5.9, 4);
33c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
34c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  template<typename ...As> struct A {
35c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org    template<typename ...Bs> struct B {
367938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org      template<typename ...Cs> struct C {
377938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org        C(As..., Bs..., int &k, Cs...);
387938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org      };
397938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org    };
407938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  };
41cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org  A<>::B<>::C<> c000(k);
427938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  A<int>::B<>::C<int> c101(1, k, 3);
437938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  A<>::B<int>::C<int> c011(1, k, 3);
447938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  A<int>::B<int>::C<> c110(1, 2, k);
457938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  A<int, int>::B<int, int>::C<int, int> c222(1, 2, 3, 4, k, 5, 6);
467938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  A<int, int, int>::B<>::C<> c300(1, 2, 3, k);
475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  int &f();
495faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  char &f(void*);
50cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org  template<typename ...A> struct U {
518640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org    template<typename ...B> struct V {
528640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org      auto g(A...a, B...b) -> decltype(f(a...));
535faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org    };
545faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  };
555faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  U<>::V<int*> v0;
563bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org  U<int*>::V<> v1;
57cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org  int &v0f = v0.g(0);
58cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org  char &v1f = v1.g(0);
595faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}
605faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgnamespace PR12096 {
618b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org  void Foo(int) {}
62ce33d60187718e7bb01944ee130c9f5d9fb335eccommit-bot@chromium.org  void Foo(int, int) = delete;
63025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org  template<typename ...Args> struct Var {
64025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org    Var(const Args &...args, int *) { Foo(args...); }
65025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org  };
665faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  Var<int> var(1, 0);
675faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}
68d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org
69d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org// In an initializer-list (8.5); the pattern is an initializer-clause.
70d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org// Note: this also covers expression-lists, since expression-list is
71d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org// just defined as initializer-list.
72025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.orgvoid five_args(int, int, int, int, int); // expected-note{{candidate function not viable: requires 5 arguments, but 6 were provided}}
73025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org
74d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.orgtemplate<int ...Values>
75025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.orgvoid initializer_list_expansion() {
76025128811219dc45fd99b6c4d1d14f833cf7a26ecommit-bot@chromium.org  int values[5] = { Values... }; // expected-error{{excess elements in array initializer}}
77d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org  five_args(Values...); // expected-error{{no matching function for call to 'five_args'}}
78d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org}
79d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org
805faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate void initializer_list_expansion<1, 2, 3, 4, 5>();
815faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate void initializer_list_expansion<1, 2, 3, 4, 5, 6>(); // expected-note{{in instantiation of function template specialization 'initializer_list_expansion<1, 2, 3, 4, 5, 6>' requested here}}
82cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
83cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.orgnamespace PR8977 {
845faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  struct A { };
858640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org  template<typename T, typename... Args> void f(Args... args) {
86d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org    // An empty expression-list performs value initialization.
87d594dbec0407343b7ac13af9c4580ec5933ab060commit-bot@chromium.org    constexpr T t(args...);
88c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  };
89c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
905faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  template void f<A>();
915faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org}
928b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org
935faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// In a base-specifier-list (Clause 10); the pattern is a base-specifier.
945faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename ...Mixins>
955faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct HasMixins : public Mixins... {
965faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  HasMixins();
975faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  HasMixins(const HasMixins&);
985faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  HasMixins(int i);
99cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org};
100cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
1015faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct A { }; // expected-note{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument}} \
1028640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org// expected-note{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A' for 1st argument}} \
1035faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// expected-note{{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
1045faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct B { };
1055faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct C { };
1065faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct D { };
1075faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1085faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgA *checkA = new HasMixins<A, B, C, D>;
1095faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgB *checkB = new HasMixins<A, B, C, D>;
1105faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgD *checkD = new HasMixins<A, B, C, D>;
1117938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgC *checkC = new HasMixins<A, B, D>; // expected-error{{cannot initialize a variable of type 'C *' with an rvalue of type 'HasMixins<A, B, D> *'}}
1125faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgHasMixins<> *checkNone = new HasMixins<>;
1135faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1145faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename Mixins>
1155faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct BrokenMixins : public Mixins... { }; // expected-error{{pack expansion does not contain any unexpanded parameter packs}}
1165faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1175faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// In a mem-initializer-list (12.6.2); the pattern is a mem-initializer.
1187938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgtemplate<typename ...Mixins>
1197938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgHasMixins<Mixins...>::HasMixins(): Mixins()... { }
1207938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org
1215faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename ...Mixins>
1225faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgHasMixins<Mixins...>::HasMixins(const HasMixins &other): Mixins(other)... { }
1235faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1245faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename ...Mixins>
1255faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgHasMixins<Mixins...>::HasMixins(int i): Mixins(i)... { } // expected-error{{no matching constructor for initialization of 'A'}}
1265faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1277938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgvoid test_has_mixins() {
1287938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  HasMixins<A, B> ab;
1297938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  HasMixins<A, B> ab2 = ab;
1307938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  HasMixins<A, B> ab3(17); // expected-note{{in instantiation of member function 'HasMixins<A, B>::HasMixins' requested here}}
1317938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org}
1325faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1337938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgtemplate<typename T>
1347938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgstruct X {
1355faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  T member;
1365faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1375faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  X() : member()... { } // expected-error{{pack expansion for initialization of member 'member'}}
1385faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
1395faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1405faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// There was a bug in the delayed parsing code for the
1415faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// following case.
1427938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgtemplate<typename ...T>
1437938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgstruct DelayedParseTest : T...
1445faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org{
1455faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  int a;
1465faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  DelayedParseTest(T... i) : T{i}..., a{10} {}
1475faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
1485faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1495faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1505faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// In a template-argument-list (14.3); the pattern is a template-argument.
1518640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.orgtemplate<typename ...Types>
1527938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgstruct tuple_of_refs {
1537938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  typedef tuple<Types& ...> types;
1548c7372bbe8949f2864bd3d9df00d85c5669a74b1senorblanco@chromium.org};
155ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org
1568c7372bbe8949f2864bd3d9df00d85c5669a74b1senorblanco@chromium.orgtuple<int&, float&> *t_int_ref_float_ref;
1578c7372bbe8949f2864bd3d9df00d85c5669a74b1senorblanco@chromium.orgtuple_of_refs<int&, float&>::types *t_int_ref_float_ref_2 =  t_int_ref_float_ref;
1589195743aac79a4fa82059ab614b9795f215475f7senorblanco@chromium.org
1599195743aac79a4fa82059ab614b9795f215475f7senorblanco@chromium.orgtemplate<typename ...Types>
1605faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct extract_nested_types {
1617938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  typedef tuple<typename Types::type...> types;
1625faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
1635faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1645faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtuple<int, float> *t_int_float;
1655faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgextract_nested_types<identity<int>, identity<float> >::types *t_int_float_2
1667938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org  = t_int_float;
167cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
168cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.orgtemplate<int ...N>
1697938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.orgstruct tuple_of_ints {
1705faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  typedef tuple<int_c<N>...> type;
1718640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org};
1728640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org
1738640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.orgint check_temp_arg_1[is_same<tuple_of_ints<1, 2, 3, 4, 5>::type,
1745faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org                             tuple<int_c<1>, int_c<2>, int_c<3>, int_c<4>,
1755faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org                                   int_c<5>>>::value? 1 : -1];
1765faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org
1775faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org// In a dynamic-exception-specification (15.4); the pattern is a type-id.
1785faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgtemplate<typename ...Types>
1798640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.orgstruct f_with_except {
1808640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org  virtual void f() throw(Types...); // expected-note{{overridden virtual function is here}}
1813bc16c8bc1ecb9ac4450f58093cc9e3edb8a50b8senorblanco@chromium.org};
182cc9471c36d3967270f7eb26f8b53ce0f17bc9fbbsenorblanco@chromium.org
183cc9471c36d3967270f7eb26f8b53ce0f17bc9fbbsenorblanco@chromium.orgstruct check_f_with_except_1 : f_with_except<int, float> {
184cc9471c36d3967270f7eb26f8b53ce0f17bc9fbbsenorblanco@chromium.org  virtual void f() throw(int, float);
1858640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org};
1867938bae14af94c1d48d122a2d686e123b66411a7senorblanco@chromium.org
1878640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.orgstruct check_f_with_except_2 : f_with_except<int, float> {
1888640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org  virtual void f() throw(int);
1898640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org};
1908640d5024d57da5508bdf7585849e3b1f1cb365bsenorblanco@chromium.org
1915faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.orgstruct check_f_with_except_3 : f_with_except<int, float> {
1925faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org  virtual void f() throw(int, float, double); // expected-error{{exception specification of overriding function is more lax than base version}}
1935faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org};
1945faa2dc266ec933b3961f985e5718236f1ecbe47senorblanco@chromium.org