<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Richard,<div class=""><br class=""></div><div class="">Thank you for the feedback. Please review my new patch: <a href="https://reviews.llvm.org/D62645" class="">https://reviews.llvm.org/D62645</a>.</div><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Apr 23, 2019, at 7:21 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Hi Akira,<br class=""><br class="">I've reverted this in r359066. This subtly breaks the semantics of C++<br class="">initializers by strripping off an outer level of parentheses / braces<br class="">in some cases. Testcase:<br class=""><br class="">  struct A {<br class="">    A();<br class="">    A(const A&) = delete;<br class="">  };<br class="">  auto x = [a{A()}] {};<br class=""><br class="">(This should be accepted in C++17 mode onwards, but this patch rejects<br class="">it by losing the braces around the A() expression.)<br class=""><br class="">Moreover, I think this is fundamentally the wrong approach:<br class="">DeduceAutoType should not ever be changing the initializer expression<br class="">(and it certainly shouldn't expect those changes to stick around).<br class="">Instead, we should check for a placeholder type before attempting<br class="">deduction, just like we correct typos in the initializer before<br class="">attempting deduction.<br class=""><br class="">On Thu, 10 Jan 2019 at 21:01, Akira Hatanaka via cfe-commits<br class=""><<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""><blockquote type="cite" class=""><br class="">Author: ahatanak<br class="">Date: Thu Jan 10 20:57:34 2019<br class="">New Revision: 350917<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=350917&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=350917&view=rev</a><br class="">Log:<br class="">[Sema] If CheckPlaceholderExpr rewrites the initializer of an auto<br class="">variable during auto type deduction, use the rewritten initializer when<br class="">performing initialization of the variable.<br class=""><br class="">This silences spurious -Warc-repeated-use-of-weak warnings that are<br class="">issued when the initializer uses a weak ObjC pointer.<br class=""><br class="">Differential Revision: <a href="https://reviews.llvm.org/D55662" class="">https://reviews.llvm.org/D55662</a><br class=""><br class="">Modified:<br class="">    cfe/trunk/include/clang/Sema/Sema.h<br class="">    cfe/trunk/lib/Sema/SemaDecl.cpp<br class="">    cfe/trunk/lib/Sema/SemaExprCXX.cpp<br class="">    cfe/trunk/lib/Sema/SemaLambda.cpp<br class="">    cfe/trunk/test/SemaObjC/arc-repeated-weak.mm<br class=""><br class="">Modified: cfe/trunk/include/clang/Sema/Sema.h<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=350917&r1=350916&r2=350917&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=350917&r1=350916&r2=350917&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/include/clang/Sema/Sema.h (original)<br class="">+++ cfe/trunk/include/clang/Sema/Sema.h Thu Jan 10 20:57:34 2019<br class="">@@ -1960,7 +1960,7 @@ public:<br class="">   bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);<br class="">   void CheckVariableDeclarationType(VarDecl *NewVD);<br class="">   bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,<br class="">-                                     Expr *Init);<br class="">+                                     Expr *&Init);<br class="">   void CheckCompleteVariableDeclaration(VarDecl *VD);<br class="">   void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD);<br class="">   void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D);<br class="">@@ -7095,7 +7095,7 @@ public:<br class="">   QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name,<br class="">                                         QualType Type, TypeSourceInfo *TSI,<br class="">                                         SourceRange Range, bool DirectInit,<br class="">-                                        Expr *Init);<br class="">+                                        Expr *&Init);<br class=""><br class="">   TypeLoc getReturnTypeLoc(FunctionDecl *FD) const;<br class=""><br class=""><br class="">Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=350917&r1=350916&r2=350917&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=350917&r1=350916&r2=350917&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Jan 10 20:57:34 2019<br class="">@@ -10812,7 +10812,7 @@ QualType Sema::deduceVarTypeFromInitiali<br class="">                                             DeclarationName Name, QualType Type,<br class="">                                             TypeSourceInfo *TSI,<br class="">                                             SourceRange Range, bool DirectInit,<br class="">-                                            Expr *Init) {<br class="">+                                            Expr *&Init) {<br class="">   bool IsInitCapture = !VDecl;<br class="">   assert((!VDecl || !VDecl->isInitCapture()) &&<br class="">          "init captures are expected to be deduced prior to initialization");<br class="">@@ -10928,7 +10928,8 @@ QualType Sema::deduceVarTypeFromInitiali<br class="">           << (DeduceInit->getType().isNull() ? TSI->getType()<br class="">                                              : DeduceInit->getType())<br class="">           << DeduceInit->getSourceRange();<br class="">-  }<br class="">+  } else<br class="">+    Init = DeduceInit;<br class=""><br class="">   // Warn if we deduced 'id'. 'auto' usually implies type-safety, but using<br class="">   // 'id' instead of a specific object type prevents most of our usual<br class="">@@ -10945,7 +10946,7 @@ QualType Sema::deduceVarTypeFromInitiali<br class=""> }<br class=""><br class=""> bool Sema::DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,<br class="">-                                         Expr *Init) {<br class="">+                                         Expr *&Init) {<br class="">   QualType DeducedType = deduceVarTypeFromInitializer(<br class="">       VDecl, VDecl->getDeclName(), VDecl->getType(), VDecl->getTypeSourceInfo(),<br class="">       VDecl->getSourceRange(), DirectInit, Init);<br class="">@@ -11451,8 +11452,9 @@ void Sema::ActOnUninitializedDecl(Decl *<br class="">       return;<br class="">     }<br class=""><br class="">+    Expr *TmpInit = nullptr;<br class="">     if (Type->isUndeducedType() &&<br class="">-        DeduceVariableDeclarationType(Var, false, nullptr))<br class="">+        DeduceVariableDeclarationType(Var, false, TmpInit))<br class="">       return;<br class=""><br class="">     // C++11 [class.static.data]p3: A static data member can be declared with<br class=""><br class="">Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=350917&r1=350916&r2=350917&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=350917&r1=350916&r2=350917&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Jan 10 20:57:34 2019<br class="">@@ -1865,12 +1865,11 @@ Sema::BuildCXXNew(SourceRange Range, boo<br class="">     if (Braced && !getLangOpts().CPlusPlus17)<br class="">       Diag(Initializer->getBeginLoc(), diag::ext_auto_new_list_init)<br class="">           << AllocType << TypeRange;<br class="">-    Expr *Deduce = Inits[0];<br class="">     QualType DeducedType;<br class="">-    if (DeduceAutoType(AllocTypeInfo, Deduce, DeducedType) == DAR_Failed)<br class="">+    if (DeduceAutoType(AllocTypeInfo, Inits[0], DeducedType) == DAR_Failed)<br class="">       return ExprError(Diag(StartLoc, diag::err_auto_new_deduction_failure)<br class="">-                       << AllocType << Deduce->getType()<br class="">-                       << TypeRange << Deduce->getSourceRange());<br class="">+                       << AllocType << Inits[0]->getType()<br class="">+                       << TypeRange << Inits[0]->getSourceRange());<br class="">     if (DeducedType.isNull())<br class="">       return ExprError();<br class="">     AllocType = DeducedType;<br class=""><br class="">Modified: cfe/trunk/lib/Sema/SemaLambda.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLambda.cpp?rev=350917&r1=350916&r2=350917&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLambda.cpp?rev=350917&r1=350916&r2=350917&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/Sema/SemaLambda.cpp (original)<br class="">+++ cfe/trunk/lib/Sema/SemaLambda.cpp Thu Jan 10 20:57:34 2019<br class="">@@ -759,14 +759,15 @@ QualType Sema::buildLambdaInitCaptureIni<br class="">   TypeSourceInfo *TSI = TLB.getTypeSourceInfo(Context, DeductType);<br class=""><br class="">   // Deduce the type of the init capture.<br class="">+  Expr *DeduceInit = Init;<br class="">   QualType DeducedType = deduceVarTypeFromInitializer(<br class="">       /*VarDecl*/nullptr, DeclarationName(Id), DeductType, TSI,<br class="">-      SourceRange(Loc, Loc), IsDirectInit, Init);<br class="">+      SourceRange(Loc, Loc), IsDirectInit, DeduceInit);<br class="">   if (DeducedType.isNull())<br class="">     return QualType();<br class=""><br class="">   // Are we a non-list direct initialization?<br class="">-  ParenListExpr *CXXDirectInit = dyn_cast<ParenListExpr>(Init);<br class="">+  bool CXXDirectInit = isa<ParenListExpr>(Init);<br class=""><br class="">   // Perform initialization analysis and ensure any implicit conversions<br class="">   // (such as lvalue-to-rvalue) are enforced.<br class="">@@ -779,10 +780,7 @@ QualType Sema::buildLambdaInitCaptureIni<br class="">                            : InitializationKind::CreateDirectList(Loc))<br class="">           : InitializationKind::CreateCopy(Loc, Init->getBeginLoc());<br class=""><br class="">-  MultiExprArg Args = Init;<br class="">-  if (CXXDirectInit)<br class="">-    Args =<br class="">-        MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());<br class="">+  MultiExprArg Args = DeduceInit;<br class="">   QualType DclT;<br class="">   InitializationSequence InitSeq(*this, Entity, Kind, Args);<br class="">   ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Args, &DclT);<br class=""><br class="">Modified: cfe/trunk/test/SemaObjC/arc-repeated-weak.mm<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc-repeated-weak.mm?rev=350917&r1=350916&r2=350917&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc-repeated-weak.mm?rev=350917&r1=350916&r2=350917&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/SemaObjC/arc-repeated-weak.mm (original)<br class="">+++ cfe/trunk/test/SemaObjC/arc-repeated-weak.mm Thu Jan 10 20:57:34 2019<br class="">@@ -1,5 +1,5 @@<br class="">-// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime-has-weak -fobjc-arc -fblocks -Wno-objc-root-class -std=c++11 -Warc-repeated-use-of-weak -verify %s<br class="">-// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime-has-weak -fobjc-weak -fblocks -Wno-objc-root-class -std=c++11 -Warc-repeated-use-of-weak -verify %s<br class="">+// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime-has-weak -fobjc-arc -fblocks -Wno-objc-root-class -std=c++14 -Warc-repeated-use-of-weak -verify %s<br class="">+// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime-has-weak -fobjc-weak -fblocks -Wno-objc-root-class -std=c++14 -Warc-repeated-use-of-weak -verify %s<br class=""><br class=""> @interface Test {<br class=""> @public<br class="">@@ -467,6 +467,18 @@ void foo() {<br class="">   __typeof__(NSBundle2.foo2.weakProp) t5;<br class=""> }<br class=""><br class="">+void testAuto() {<br class="">+  auto __weak wp = NSBundle2.foo2.weakProp;<br class="">+}<br class="">+<br class="">+void testLambdaCaptureInit() {<br class="">+  [capture(NSBundle2.foo2.weakProp)] {} ();<br class="">+}<br class="">+<br class="">+void testAutoNew() {<br class="">+  auto p = new auto(NSBundle2.foo2.weakProp);<br class="">+}<br class="">+<br class=""> // This used to crash in the constructor of WeakObjectProfileTy when a<br class=""> // DeclRefExpr was passed that didn't reference a VarDecl.<br class=""><br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits<br class=""></blockquote></div></div></blockquote></div><br class=""></div></body></html>