This revision was automatically updated to reflect the committed changes. Closed by commit rL357236: [Sema] Fix a crash when nonnull checking (authored by hliao, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits.
Changed prior to commit: https://reviews.llvm.org/D59900?vs=192514&id=192776#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D59900/new/ https://reviews.llvm.org/D59900 Files: cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/test/SemaCXX/pr30559.cpp Index: cfe/trunk/test/SemaCXX/pr30559.cpp =================================================================== --- cfe/trunk/test/SemaCXX/pr30559.cpp +++ cfe/trunk/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); +} Index: cfe/trunk/lib/Sema/SemaChecking.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp +++ cfe/trunk/lib/Sema/SemaChecking.cpp @@ -11592,6 +11592,9 @@ } 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);
Index: cfe/trunk/test/SemaCXX/pr30559.cpp =================================================================== --- cfe/trunk/test/SemaCXX/pr30559.cpp +++ cfe/trunk/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); +} Index: cfe/trunk/lib/Sema/SemaChecking.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp +++ cfe/trunk/lib/Sema/SemaChecking.cpp @@ -11592,6 +11592,9 @@ } 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);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits