]> granicus.if.org Git - clang/commitdiff
Fix a crash when the size of an 'auto' is needed and its initalizer
authorKaelyn Takata <rikka@google.com>
Tue, 17 Mar 2015 23:50:12 +0000 (23:50 +0000)
committerKaelyn Takata <rikka@google.com>
Tue, 17 Mar 2015 23:50:12 +0000 (23:50 +0000)
contained a typo correction (the auto decl was being marked as dependent
unnecessarily, which triggered an assertion in cases where the size of
the type is needed).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232568 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/cxx11-crashes.cpp

index 32e3924e35e0d4a6d7c6a214119622003e045360..743c4ce4d147ffd4e71a7124ce8fb6e2efd589ce 100644 (file)
@@ -8688,6 +8688,20 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
 
   // C++11 [decl.spec.auto]p6. Deduce the type which 'auto' stands in for.
   if (TypeMayContainAuto && VDecl->getType()->isUndeducedType()) {
+    // Attempt typo correction early so that the type of the init expression can
+    // be deduced based on the chosen correction:if the original init contains a
+    // TypoExpr.
+    ExprResult Res = CorrectDelayedTyposInExpr(Init);
+    if (!Res.isUsable()) {
+      RealDecl->setInvalidDecl();
+      return;
+    }
+    if (Res.get() != Init) {
+      Init = Res.get();
+      if (CXXDirectInit)
+        CXXDirectInit = dyn_cast<ParenListExpr>(Init);
+    }
+
     Expr *DeduceInit = Init;
     // Initializer could be a C++ direct-initializer. Deduction only works if it
     // contains exactly one expression.
index bd51af1da2fa5b71bd0edc6d956e92e95013c790..97c959454c354c651042b036b9e11e1b9b8a64c2 100644 (file)
@@ -74,3 +74,20 @@ namespace b6981007 {
     }
   }
 }
+
+namespace incorrect_auto_type_deduction_for_typo {
+struct S {
+  template <typename T> S(T t) {
+    (void)sizeof(t);
+    (void)new auto(t);
+  }
+};
+
+void Foo(S);
+
+void test(int some_number) {  // expected-note {{'some_number' declared here}}
+  auto x = sum_number;  // expected-error {{use of undeclared identifier 'sum_number'; did you mean 'some_number'?}}
+  auto lambda = [x] {};
+  Foo(lambda);
+}
+}