[clang] 936ec89 - [AST] Fix a clang crash on an invalid for-range statement.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 8 08:32:45 PDT 2020
Author: Haojian Wu
Date: 2020-06-08T17:32:10+02:00
New Revision: 936ec89e91e2dda8b6110b1fd1f9920509d7a17b
URL: https://github.com/llvm/llvm-project/commit/936ec89e91e2dda8b6110b1fd1f9920509d7a17b
DIFF: https://github.com/llvm/llvm-project/commit/936ec89e91e2dda8b6110b1fd1f9920509d7a17b.diff
LOG: [AST] Fix a clang crash on an invalid for-range statement.
Summary:
crash stack:
```
llvm-project/clang/lib/AST/ASTContext.cpp:2248: clang::TypeInfo clang::ASTContext::getTypeInfoImpl(const clang::Type *) const: Assertion `!A->getDeducedType().isNull() && "cannot request the size of an undeduced or dependent auto type"' failed.
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
#0 0x00000000025bb0bf llvm::sys::PrintStackTrace(llvm::raw_ostream&) llvm-project/llvm/lib/Support/Unix/Signals.inc:564:13
#1 0x00000000025b92b0 llvm::sys::RunSignalHandlers() llvm-project/llvm/lib/Support/Signals.cpp:69:18
#2 0x00000000025bb535 SignalHandler(int) llvm-project/llvm/lib/Support/Unix/Signals.inc:396:3
#3 0x00007f9ef9298110 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14110)
#4 0x00007f9ef8d72761 raise /build/glibc-M65Gwz/glibc-2.30/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
#5 0x00007f9ef8d5c55b abort /build/glibc-M65Gwz/glibc-2.30/stdlib/abort.c:81:7
#6 0x00007f9ef8d5c42f get_sysdep_segment_value /build/glibc-M65Gwz/glibc-2.30/intl/loadmsgcat.c:509:8
#7 0x00007f9ef8d5c42f _nl_load_domain /build/glibc-M65Gwz/glibc-2.30/intl/loadmsgcat.c:970:34
#8 0x00007f9ef8d6b092 (/lib/x86_64-linux-gnu/libc.so.6+0x34092)
#9 0x000000000458abe0 clang::ASTContext::getTypeInfoImpl(clang::Type const*) const llvm-project/clang/lib/AST/ASTContext.cpp:0:5
```
Reviewers: sammccall
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D81384
Added:
clang/test/SemaCXX/for-range-crash.cpp
Modified:
clang/lib/Sema/SemaStmt.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index dda0d3486e0e..8d32fc094494 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -2434,8 +2434,11 @@ StmtResult Sema::BuildCXXForRangeStmt(SourceLocation ForLoc,
QualType RangeType = Range->getType();
if (RequireCompleteType(RangeLoc, RangeType,
- diag::err_for_range_incomplete_type))
+ diag::err_for_range_incomplete_type)) {
+ if (LoopVar->getType()->isUndeducedType())
+ LoopVar->setInvalidDecl();
return StmtError();
+ }
// Build auto __begin = begin-expr, __end = end-expr.
// Divide by 2, since the variables are in the inner scope (loop body).
diff --git a/clang/test/SemaCXX/for-range-crash.cpp b/clang/test/SemaCXX/for-range-crash.cpp
new file mode 100644
index 000000000000..21637264a2bf
--- /dev/null
+++ b/clang/test/SemaCXX/for-range-crash.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s
+
+template <typename>
+class Bar {
+ Bar<int> *variables_to_modify;
+ foo() { // expected-error {{C++ requires a type specifier for all declarations}}
+ for (auto *c : *variables_to_modify)
+ delete c;
+ }
+};
More information about the cfe-commits
mailing list