forked from OSchip/llvm-project
[Sema] If CheckPlaceholderExpr rewrites the initializer of an auto
variable during auto type deduction, use the rewritten initializer when performing initialization of the variable. This silences spurious -Warc-repeated-use-of-weak warnings that are issued when the initializer uses a weak ObjC pointer. Differential Revision: https://reviews.llvm.org/D55662 llvm-svn: 350917
This commit is contained in:
parent
eb139def3d
commit
d458ceda24
|
@ -1960,7 +1960,7 @@ public:
|
|||
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
|
||||
void CheckVariableDeclarationType(VarDecl *NewVD);
|
||||
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,
|
||||
Expr *Init);
|
||||
Expr *&Init);
|
||||
void CheckCompleteVariableDeclaration(VarDecl *VD);
|
||||
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD);
|
||||
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D);
|
||||
|
@ -7095,7 +7095,7 @@ public:
|
|||
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name,
|
||||
QualType Type, TypeSourceInfo *TSI,
|
||||
SourceRange Range, bool DirectInit,
|
||||
Expr *Init);
|
||||
Expr *&Init);
|
||||
|
||||
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const;
|
||||
|
||||
|
|
|
@ -10812,7 +10812,7 @@ QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl,
|
|||
DeclarationName Name, QualType Type,
|
||||
TypeSourceInfo *TSI,
|
||||
SourceRange Range, bool DirectInit,
|
||||
Expr *Init) {
|
||||
Expr *&Init) {
|
||||
bool IsInitCapture = !VDecl;
|
||||
assert((!VDecl || !VDecl->isInitCapture()) &&
|
||||
"init captures are expected to be deduced prior to initialization");
|
||||
|
@ -10928,7 +10928,8 @@ QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl,
|
|||
<< (DeduceInit->getType().isNull() ? TSI->getType()
|
||||
: DeduceInit->getType())
|
||||
<< DeduceInit->getSourceRange();
|
||||
}
|
||||
} else
|
||||
Init = DeduceInit;
|
||||
|
||||
// Warn if we deduced 'id'. 'auto' usually implies type-safety, but using
|
||||
// 'id' instead of a specific object type prevents most of our usual
|
||||
|
@ -10945,7 +10946,7 @@ QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl,
|
|||
}
|
||||
|
||||
bool Sema::DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit,
|
||||
Expr *Init) {
|
||||
Expr *&Init) {
|
||||
QualType DeducedType = deduceVarTypeFromInitializer(
|
||||
VDecl, VDecl->getDeclName(), VDecl->getType(), VDecl->getTypeSourceInfo(),
|
||||
VDecl->getSourceRange(), DirectInit, Init);
|
||||
|
@ -11451,8 +11452,9 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl) {
|
|||
return;
|
||||
}
|
||||
|
||||
Expr *TmpInit = nullptr;
|
||||
if (Type->isUndeducedType() &&
|
||||
DeduceVariableDeclarationType(Var, false, nullptr))
|
||||
DeduceVariableDeclarationType(Var, false, TmpInit))
|
||||
return;
|
||||
|
||||
// C++11 [class.static.data]p3: A static data member can be declared with
|
||||
|
|
|
@ -1865,12 +1865,11 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
|
|||
if (Braced && !getLangOpts().CPlusPlus17)
|
||||
Diag(Initializer->getBeginLoc(), diag::ext_auto_new_list_init)
|
||||
<< AllocType << TypeRange;
|
||||
Expr *Deduce = Inits[0];
|
||||
QualType DeducedType;
|
||||
if (DeduceAutoType(AllocTypeInfo, Deduce, DeducedType) == DAR_Failed)
|
||||
if (DeduceAutoType(AllocTypeInfo, Inits[0], DeducedType) == DAR_Failed)
|
||||
return ExprError(Diag(StartLoc, diag::err_auto_new_deduction_failure)
|
||||
<< AllocType << Deduce->getType()
|
||||
<< TypeRange << Deduce->getSourceRange());
|
||||
<< AllocType << Inits[0]->getType()
|
||||
<< TypeRange << Inits[0]->getSourceRange());
|
||||
if (DeducedType.isNull())
|
||||
return ExprError();
|
||||
AllocType = DeducedType;
|
||||
|
|
|
@ -759,14 +759,15 @@ QualType Sema::buildLambdaInitCaptureInitialization(SourceLocation Loc,
|
|||
TypeSourceInfo *TSI = TLB.getTypeSourceInfo(Context, DeductType);
|
||||
|
||||
// Deduce the type of the init capture.
|
||||
Expr *DeduceInit = Init;
|
||||
QualType DeducedType = deduceVarTypeFromInitializer(
|
||||
/*VarDecl*/nullptr, DeclarationName(Id), DeductType, TSI,
|
||||
SourceRange(Loc, Loc), IsDirectInit, Init);
|
||||
SourceRange(Loc, Loc), IsDirectInit, DeduceInit);
|
||||
if (DeducedType.isNull())
|
||||
return QualType();
|
||||
|
||||
// Are we a non-list direct initialization?
|
||||
ParenListExpr *CXXDirectInit = dyn_cast<ParenListExpr>(Init);
|
||||
bool CXXDirectInit = isa<ParenListExpr>(Init);
|
||||
|
||||
// Perform initialization analysis and ensure any implicit conversions
|
||||
// (such as lvalue-to-rvalue) are enforced.
|
||||
|
@ -779,10 +780,7 @@ QualType Sema::buildLambdaInitCaptureInitialization(SourceLocation Loc,
|
|||
: InitializationKind::CreateDirectList(Loc))
|
||||
: InitializationKind::CreateCopy(Loc, Init->getBeginLoc());
|
||||
|
||||
MultiExprArg Args = Init;
|
||||
if (CXXDirectInit)
|
||||
Args =
|
||||
MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
|
||||
MultiExprArg Args = DeduceInit;
|
||||
QualType DclT;
|
||||
InitializationSequence InitSeq(*this, Entity, Kind, Args);
|
||||
ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Args, &DclT);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
|
||||
@interface Test {
|
||||
@public
|
||||
|
@ -467,6 +467,18 @@ void foo() {
|
|||
__typeof__(NSBundle2.foo2.weakProp) t5;
|
||||
}
|
||||
|
||||
void testAuto() {
|
||||
auto __weak wp = NSBundle2.foo2.weakProp;
|
||||
}
|
||||
|
||||
void testLambdaCaptureInit() {
|
||||
[capture(NSBundle2.foo2.weakProp)] {} ();
|
||||
}
|
||||
|
||||
void testAutoNew() {
|
||||
auto p = new auto(NSBundle2.foo2.weakProp);
|
||||
}
|
||||
|
||||
// This used to crash in the constructor of WeakObjectProfileTy when a
|
||||
// DeclRefExpr was passed that didn't reference a VarDecl.
|
||||
|
||||
|
|
Loading…
Reference in New Issue