// 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}}
}