forked from OSchip/llvm-project
168 lines
4.0 KiB
C++
168 lines
4.0 KiB
C++
// 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}}
|
|
}
|