From ce38992a307908a3b2b97950a3a2a356ab32410d Mon Sep 17 00:00:00 2001 From: Michael Liao Date: Fri, 29 Mar 2019 03:55:52 +0000 Subject: [PATCH] [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 --- clang/lib/Sema/SemaChecking.cpp | 3 +++ clang/test/SemaCXX/pr30559.cpp | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 clang/test/SemaCXX/pr30559.cpp diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index df77ab9..024d78b 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -11592,6 +11592,9 @@ void Sema::DiagnoseAlwaysNonNullPointer(Expr *E, } if (const auto *FD = dyn_cast(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); diff --git a/clang/test/SemaCXX/pr30559.cpp b/clang/test/SemaCXX/pr30559.cpp new file mode 100644 index 0000000..bcd2385 --- /dev/null +++ b/clang/test/SemaCXX/pr30559.cpp @@ -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 +auto foo(T x) -> decltype((x == nullptr), *x) { + return *x; +} + +void bar() { + foo(new int); +} -- 2.7.4