<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>