| // RUN: %clang_cc1 -verify %s -std=c++17 -Wno-unused | 
 |  | 
 | template<typename ...Ts> void PackInsideTypedefDeclaration() { | 
 |   ([] { | 
 |     typedef Ts Type; | 
 |     (void)Type(); | 
 |   }(), ...); | 
 | } | 
 | template void PackInsideTypedefDeclaration<>(); | 
 | template void PackInsideTypedefDeclaration<int>(); | 
 | template void PackInsideTypedefDeclaration<int, float>(); | 
 |  | 
 | template<typename ...Ts> void PackInsideTypedefDeclarationInvalid() { | 
 |   [] { // expected-error {{contains unexpanded parameter pack 'Ts'}} | 
 |     typedef Ts Type; | 
 |     (void)Type(); | 
 |   }; | 
 |  | 
 |   ([] { | 
 |     typedef Ts Type; | 
 |     // A reference to a typedef containing an unexpanded pack does not | 
 |     // itself contain an unexpanded pack. | 
 |     f(Type()...); // expected-error {{does not contain any unexpanded}} | 
 |   }, ...); | 
 | } | 
 |  | 
 |  | 
 | template<typename ...Ts> void PackInsideAliasDeclaration() { | 
 |   ([] { | 
 |     using Type = Ts; | 
 |     (void)Type(); | 
 |   }(), ...); | 
 | } | 
 | template void PackInsideAliasDeclaration<>(); | 
 | template void PackInsideAliasDeclaration<int>(); | 
 | template void PackInsideAliasDeclaration<int, float>(); | 
 |  | 
 | template<typename ...Ts> void PackInsideAliasDeclarationInvalid() { | 
 |   [] { // expected-error {{contains unexpanded parameter pack 'Ts'}} | 
 |     using Type = Ts; | 
 |     (void)Type(); | 
 |   }; | 
 |   ([] { | 
 |     using Type = Ts; | 
 |     // A reference to an alias containing an unexpanded pack does not | 
 |     // itself contain an unexpanded pack. | 
 |     f(Type()...); // expected-error {{does not contain any unexpanded}} | 
 |   }, ...); | 
 | } | 
 |  | 
 |  | 
 | template<typename ...Ts> void PackInsideUsingDeclaration() { | 
 |   ([] { | 
 |     struct A { | 
 |       using Type = Ts; | 
 |     }; | 
 |     struct B : A { | 
 |       using typename A::Type; | 
 |     }; | 
 |     (void)typename B::Type(); | 
 |   }(), ...); | 
 | } | 
 | template void PackInsideUsingDeclaration<>(); | 
 | template void PackInsideUsingDeclaration<int>(); | 
 | template void PackInsideUsingDeclaration<int, float>(); | 
 |  | 
 | template<typename ...Ts> void PackInsideUsingDeclarationInvalid() { | 
 |   ([] { | 
 |     struct A { | 
 |       using Type = Ts; | 
 |     }; | 
 |     struct B : A { | 
 |       using typename A::Type...; // expected-error {{does not contain any unexpanded}} | 
 |     }; | 
 |   }(), ...); | 
 | } | 
 |  | 
 |  | 
 | template<typename ...Ts> void PackInsideVarDeclaration() { | 
 |   ([] { | 
 |     Ts ts; | 
 |     (void)ts; | 
 |   }, ...); | 
 | } | 
 | template void PackInsideVarDeclaration<>(); | 
 | template void PackInsideVarDeclaration<int>(); | 
 | template void PackInsideVarDeclaration<int, float>(); | 
 |  | 
 | template<typename ...Ts> void PackInsideVarDeclarationInvalid() { | 
 |   [] { // expected-error {{contains unexpanded parameter pack 'Ts'}} | 
 |     Ts ts; | 
 |     (void)ts; | 
 |   }; | 
 | } | 
 |  | 
 |  | 
 | template<typename ...Ts> void PackInsideFunctionDeclaration() { | 
 |   ([] { | 
 |     Ts ts(Ts); | 
 |     ts({}); | 
 |   }, ...); | 
 | } | 
 | template void PackInsideFunctionDeclaration<>(); | 
 | template void PackInsideFunctionDeclaration<int>(); | 
 | template void PackInsideFunctionDeclaration<int, float>(); | 
 |  | 
 | template<typename ...Ts> void PackInsideFunctionDeclarationInvalid() { | 
 |   [] { // expected-error {{contains unexpanded parameter pack 'Ts'}} | 
 |     Ts ts(Ts); | 
 |     ts({}); | 
 |   }; | 
 | } | 
 |  | 
 |  | 
 | template<typename ...Ts> void PackInsideLocalClass() { | 
 |   ([] { | 
 |     class Local { | 
 |       Ts ts; | 
 |     }; | 
 |     Local l; | 
 |   }, ...); | 
 | } | 
 | template void PackInsideLocalClass<>(); | 
 | template void PackInsideLocalClass<int>(); | 
 | template void PackInsideLocalClass<int, float>(); | 
 |  | 
 | template<typename ...Ts> void PackInsideLocalClassInvalid() { | 
 |   [] { // expected-error {{contains unexpanded parameter pack 'Ts'}} | 
 |     class Local { | 
 |       Ts ts; | 
 |     }; | 
 |     Local l; | 
 |   }; | 
 | } | 
 |  | 
 | template<typename T> using Int = int; | 
 | struct AClass {}; | 
 | template<typename T> using Class = AClass; | 
 | template<typename ...Ts> void HiddenPack() { | 
 |   (Int<Ts>(), ...); | 
 |   (Int<Ts>{}, ...); | 
 |   (Class<Ts>(), ...); | 
 |   (Class<Ts>{}, ...); | 
 |  | 
 |   ([] { | 
 |    Int<Ts>(); | 
 |    }, ...); | 
 |   ([] { | 
 |    Int<Ts>{}; | 
 |    }, ...); | 
 |   ([] { | 
 |    Class<Ts>(); | 
 |    }, ...); | 
 |   ([] { | 
 |    Class<Ts>{}; | 
 |    }, ...); | 
 | } | 
 | template void HiddenPack<>(); | 
 | template void HiddenPack<int>(); | 
 | template void HiddenPack<int, float>(); | 
 |  | 
 | template<typename ...Ts> void HiddenPackInvalid() { | 
 |   Int<Ts>(); // expected-error {{unexpanded}} | 
 |   Int<Ts>{}; // expected-error {{unexpanded}} | 
 |   Class<Ts>(); // expected-error {{unexpanded}} | 
 |   Class<Ts>{}; // expected-error {{unexpanded}} | 
 | } |