mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 11:16:07 +00:00

and only update the orginal list on a valid arugment list. When checking an individual expression template argument, and conversions are required, update the expression in the template argument. Since template arguments are speculatively checked, the copying of the template argument list prevents updating the template arguments when the list does not match the template. Additionally, clean up the integer checking code in the template diffing code. The code performs unneccessary conversions from APSInt to APInt. Fixes PR21758. This essentially reverts r224770 to recommits r224667 and r224668 with extra changes to prevent the template instantiation problems seen in PR22006. A test to catch the discovered problem is also added. llvm-svn: 226983
33 lines
696 B
C++
33 lines
696 B
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
namespace {
|
|
template <bool, typename>
|
|
void Foo() {}
|
|
|
|
template <int size>
|
|
void Foo() {
|
|
int arr[size];
|
|
// expected-error@-1 {{'arr' declared as an array with a negative size}}
|
|
}
|
|
}
|
|
|
|
void test_foo() {
|
|
Foo<-1>();
|
|
// expected-note@-1 {{in instantiation of function template specialization '(anonymous namespace)::Foo<-1>' requested here}}
|
|
}
|
|
|
|
template <bool, typename>
|
|
void Bar() {}
|
|
|
|
template <int size>
|
|
void Bar() {
|
|
int arr[size];
|
|
// expected-error@-1 {{'arr' declared as an array with a negative size}}
|
|
}
|
|
|
|
void test_bar() {
|
|
Bar<-1>();
|
|
// expected-note@-1 {{in instantiation of function template specialization 'Bar<-1>' requested here}}
|
|
}
|
|
|