r357236 - [Sema] Fix a crash when nonnull checking

Michael Liao via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 28 20:55:52 PDT 2019


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);
+}




More information about the cfe-commits mailing list