This commit is contained in:
parent
b23772381d
commit
01dba4062f
|
@ -69,6 +69,7 @@ private:
|
||||||
TEST_CASE(garbageValueFlow);
|
TEST_CASE(garbageValueFlow);
|
||||||
TEST_CASE(garbageSymbolDatabase);
|
TEST_CASE(garbageSymbolDatabase);
|
||||||
TEST_CASE(garbageAST);
|
TEST_CASE(garbageAST);
|
||||||
|
TEST_CASE(templateSimplifierCrashes);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string checkCode(const char code[], const char filename[] = "test.cpp") {
|
std::string checkCode(const char code[], const char filename[] = "test.cpp") {
|
||||||
|
@ -380,6 +381,77 @@ private:
|
||||||
|
|
||||||
checkCode("START_SECTION([EXTRA](bool isValid(const String &filename)))"); // Don't crash (#5991)
|
checkCode("START_SECTION([EXTRA](bool isValid(const String &filename)))"); // Don't crash (#5991)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void templateSimplifierCrashes() {
|
||||||
|
checkCode( //5950
|
||||||
|
"struct A { \n"
|
||||||
|
" template <class T> operator T*();\n"
|
||||||
|
"}; \n"
|
||||||
|
"\n"
|
||||||
|
"template <> A::operator char*(){ return 0; } // specialization\n"
|
||||||
|
"\n"
|
||||||
|
"int main() { \n"
|
||||||
|
" A a;\n"
|
||||||
|
" int *ip = a.operator int*();\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"namespace PR5742 {\n"
|
||||||
|
" template <class T> struct A { };\n"
|
||||||
|
" struct S {\n"
|
||||||
|
" template <class T> operator T();\n"
|
||||||
|
" } s;\n"
|
||||||
|
" void f() {\n"
|
||||||
|
" s.operator A<A<int> >();\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n");
|
||||||
|
|
||||||
|
checkCode( // 6034
|
||||||
|
"template<template<typename...> class T, typename... Args>\n"
|
||||||
|
"struct foo<T<Args...> > {\n"
|
||||||
|
" const bool value = true;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"template<int I>\n"
|
||||||
|
"struct int_\n"
|
||||||
|
"{};\n"
|
||||||
|
"\n"
|
||||||
|
"int main() {\n"
|
||||||
|
" foo<int_<0> >::value;\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
checkCode(" > template < . > struct Y < T > { = } ;\n"); //6108
|
||||||
|
|
||||||
|
checkCode( // 6117
|
||||||
|
"template <typename ...> struct something_like_tuple\n"
|
||||||
|
"{};\n"
|
||||||
|
"template <typename, typename> struct is_last {\n"
|
||||||
|
" static const bool value = false;\n"
|
||||||
|
"};\n"
|
||||||
|
"template <typename T, template <typename ...> class Tuple, typename ... Head>\n"
|
||||||
|
"struct is_last<T, Tuple<Head ..., T>>\n"
|
||||||
|
"{\n"
|
||||||
|
" static const bool value = true;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"#define SA(X) static_assert (X, #X)\n"
|
||||||
|
"\n"
|
||||||
|
"typedef something_like_tuple<char, int, float> something_like_tuple_t;\n"
|
||||||
|
"SA ((is_last<float, something_like_tuple_t>::value == false));\n"
|
||||||
|
"SA ((is_last<int, something_like_tuple_t>::value == false));\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
checkCode( //6225
|
||||||
|
"template <typename...>\n"
|
||||||
|
"void templ_fun_with_ty_pack() {}\n"
|
||||||
|
" \n"
|
||||||
|
"namespace PR20047 {\n"
|
||||||
|
" template <typename T>\n"
|
||||||
|
" struct A {};\n"
|
||||||
|
" using AliasA = A<T>;\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestGarbage)
|
REGISTER_TEST(TestGarbage)
|
||||||
|
|
Loading…
Reference in New Issue