Skip to content

Commit

Permalink
[Sema] Fix a crash when nonnull checking
Browse files Browse the repository at this point in the history
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
  • Loading branch information
darkbuck committed Mar 29, 2019
1 parent 5fddf09 commit ce38992
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
3 changes: 3 additions & 0 deletions clang/lib/Sema/SemaChecking.cpp
Expand Up @@ -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);
Expand Down
23 changes: 23 additions & 0 deletions 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 <typename T>
auto foo(T x) -> decltype((x == nullptr), *x) {
return *x;
}

void bar() {
foo(new int);
}

0 comments on commit ce38992

Please sign in to comment.