Author: Congcong Cai Date: 2023-10-10T15:32:10+08:00 New Revision: 19d1da59dcdea46d30d93a48c389856e89c57b5d
URL: https://github.com/llvm/llvm-project/commit/19d1da59dcdea46d30d93a48c389856e89c57b5d DIFF: https://github.com/llvm/llvm-project/commit/19d1da59dcdea46d30d93a48c389856e89c57b5d.diff LOG: [clang]Avoid diagnose invalid consteval call for invalid function decl (#68646) Fixes:#68542 It‘s meaningless to diagnose further error for invalid function declaration. Added: clang/test/SemaCXX/PR68542.cpp Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExpr.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 96928e98bcee156..9c320bc8b35d23d 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -375,6 +375,8 @@ Bug Fixes in This Version Fixes (`#67690 <https://github.com/llvm/llvm-project/issues/67690>`_) - Fixes a ``clang-17`` regression where ``LLVM_UNREACHABLE_OPTIMIZE=OFF`` cannot be used with ``Release`` mode builds. (`#68237 <https://github.com/llvm/llvm-project/issues/68237>`_). +- Fix crash in evaluating ``constexpr`` value for invalid template function. + Fixes (`#68542 <https://github.com/llvm/llvm-project/issues/68542>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 15e2a7978f6b723..cf45fc388083ce6 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -18408,6 +18408,8 @@ static void EvaluateAndDiagnoseImmediateInvocation( assert(FD && FD->isImmediateFunction() && "could not find an immediate function in this expression"); + if (FD->isInvalidDecl()) + return; SemaRef.Diag(CE->getBeginLoc(), diag::err_invalid_consteval_call) << FD << FD->isConsteval(); if (auto Context = diff --git a/clang/test/SemaCXX/PR68542.cpp b/clang/test/SemaCXX/PR68542.cpp new file mode 100644 index 000000000000000..fc767a78c8b0013 --- /dev/null +++ b/clang/test/SemaCXX/PR68542.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -verify -std=c++20 -fsyntax-only %s + +struct S { + int e; +}; + +template<class T> +consteval int get_format() { + return nullptr; // expected-error{{cannot initialize return object of type 'int' with an rvalue of type 'std::nullptr_t'}} +} + +template<class T> +constexpr S f(T) noexcept { + return get_format<T>(); // expected-error{{no viable conversion from returned value of type 'int' to function return type 'S'}} +} + +constexpr S x = f(0); // expected-error{{constexpr variable 'x' must be initialized by a constant expression}} +// expected-note@-1{{in instantiation of function template specialization 'f<int>' requested here}} +// expected-note@3{{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'S &&' for 1st argument}} +// expected-note@3{{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const S &' for 1st argument}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits