[clang] 7b0396f - [Clang][Sema] Fix crash when type used in return statement contains errors (#79788)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 29 10:08:13 PST 2024
Author: Shafik Yaghmour
Date: 2024-01-29T10:08:09-08:00
New Revision: 7b0396faabce0cec470779ae5e3a851bedb2ac12
URL: https://github.com/llvm/llvm-project/commit/7b0396faabce0cec470779ae5e3a851bedb2ac12
DIFF: https://github.com/llvm/llvm-project/commit/7b0396faabce0cec470779ae5e3a851bedb2ac12.diff
LOG: [Clang][Sema] Fix crash when type used in return statement contains errors (#79788)
In Sema in `BuildReturnStmt(...)` when we try to determine is the type
is move eligible or copy elidable we don't currently check of the init
of the `VarDecl` contain errors or not. This can lead to a crash since
we may send a type that is not complete into `getTypeInfo(...)` which
does not allow this.
This fixes: https://github.com/llvm/llvm-project/issues/63244
https://github.com/llvm/llvm-project/issues/79745
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaStmt.cpp
clang/test/SemaCXX/deduced-return-type-cxx14.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 9fd4d8d65627c9e..99971bf10922bae 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -138,6 +138,9 @@ Bug Fixes to C++ Support
- Fixed deducing auto& from const int in template parameters of partial
specializations.
(`#77189 <https://github.com/llvm/llvm-project/issues/77189>`_)
+- Fix for crash when using a erroneous type in a return statement.
+ Fixes (`#63244 <https://github.com/llvm/llvm-project/issues/63244>`_)
+ and (`#79745 <https://github.com/llvm/llvm-project/issues/79745>`_)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 9e7c8c7e4e8c12c..5d5a29b825ae7d7 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -3391,6 +3391,8 @@ Sema::NamedReturnInfo Sema::getNamedReturnInfo(Expr *&E,
const auto *VD = dyn_cast<VarDecl>(DR->getDecl());
if (!VD)
return NamedReturnInfo();
+ if (VD->getInit() && VD->getInit()->containsErrors())
+ return NamedReturnInfo();
NamedReturnInfo Res = getNamedReturnInfo(VD);
if (Res.Candidate && !E->isXValue() &&
(Mode == SimplerImplicitMoveMode::ForceOn ||
diff --git a/clang/test/SemaCXX/deduced-return-type-cxx14.cpp b/clang/test/SemaCXX/deduced-return-type-cxx14.cpp
index c0d43911b8c7174..415bbbf1a0bc509 100644
--- a/clang/test/SemaCXX/deduced-return-type-cxx14.cpp
+++ b/clang/test/SemaCXX/deduced-return-type-cxx14.cpp
@@ -724,3 +724,12 @@ struct DeducedTargetTypeOfConversionFunction {
// since-cxx20-error at -1 {{'decltype(auto)' not allowed in declaration of conversion function template}}
#endif
};
+
+namespace GH79745 {
+template <typename = int> struct a; // expected-note {{template is declared here}}
+auto f() {
+ a c; // cxx20_23-error {{implicit instantiation of undefined template}} \
+ // cxx14-error {{use of class template 'a' requires template arguments}}
+ return c;
+}
+}
More information about the cfe-commits
mailing list