forked from OSchip/llvm-project
[Sema] Fix a crash when nonnull checking
Summary: - If a parameter is used, nonnull checking needs function prototype to retrieve the corresponding parameter's attributes. However, at the prototype substitution phase when a template is being instantiated, expression may be created and checked without a fully specialized prototype. Under such a scenario, skip nonnull checking on that argument. Reviewers: rjmccall, tra, yaxunl Subscribers: javed.absar, kristof.beyls, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D59900 llvm-svn: 357236
This commit is contained in:
parent
5fddf09187
commit
ce38992a30
|
@ -11592,6 +11592,9 @@ void Sema::DiagnoseAlwaysNonNullPointer(Expr *E,
|
|||
}
|
||||
|
||||
if (const auto *FD = dyn_cast<FunctionDecl>(PV->getDeclContext())) {
|
||||
// Skip function template not specialized yet.
|
||||
if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate)
|
||||
return;
|
||||
auto ParamIter = llvm::find(FD->parameters(), PV);
|
||||
assert(ParamIter != FD->param_end());
|
||||
unsigned ParamNo = std::distance(FD->param_begin(), ParamIter);
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s
|
||||
|
||||
template < bool, class > struct A {};
|
||||
template < class, int > void f () {};
|
||||
template < class T, int >
|
||||
decltype (f < T, 1 >) f (T t, typename A < t == 0, int >::type) {};
|
||||
|
||||
struct B {};
|
||||
|
||||
int main ()
|
||||
{
|
||||
f < B, 0 >;
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto foo(T x) -> decltype((x == nullptr), *x) {
|
||||
return *x;
|
||||
}
|
||||
|
||||
void bar() {
|
||||
foo(new int);
|
||||
}
|
Loading…
Reference in New Issue