Author: hliao Date: Thu Mar 28 20:55:52 2019 New Revision: 357236 URL: http://llvm.org/viewvc/llvm-project?rev=357236&view=rev Log: [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 Added: cfe/trunk/test/SemaCXX/pr30559.cpp Modified: cfe/trunk/lib/Sema/SemaChecking.cpp Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=357236&r1=357235&r2=357236&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Thu Mar 28 20:55:52 2019 @@ -11592,6 +11592,9 @@ void Sema::DiagnoseAlwaysNonNullPointer( } 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); Added: cfe/trunk/test/SemaCXX/pr30559.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/pr30559.cpp?rev=357236&view=auto ============================================================================== --- cfe/trunk/test/SemaCXX/pr30559.cpp (added) +++ cfe/trunk/test/SemaCXX/pr30559.cpp Thu Mar 28 20:55:52 2019 @@ -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); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits