forked from OSchip/llvm-project
Revert [Sema] Resolve placeholder types before type deduction to silence spurious `-Warc-repeated-use-of-weak` warnings
This reverts r365382 (git commit 8b1becf2e3
)
Appears to regress this semi-reduced fragment of valid code from windows
SDK headers:
#define InterlockedIncrement64 _InterlockedIncrement64
extern "C" __int64 InterlockedIncrement64(__int64 volatile *Addend);
#pragma intrinsic(_InterlockedIncrement64)
unsigned __int64 InterlockedIncrement(unsigned __int64 volatile *Addend) {
return (unsigned __int64)(InterlockedIncrement64)((volatile __int64 *)Addend);
}
Found on a buildbot here, but no mail was sent due to it already being
red:
http://lab.llvm.org:8011/builders/sanitizer-windows/builds/48067
llvm-svn: 365393
This commit is contained in:
parent
a5ede3182b
commit
345708b681
|
@ -490,15 +490,6 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
/// Returns whether this expression has a placeholder type that isn't
|
||||
/// Overload.
|
||||
bool hasNonOverloadPlaceholderType() const {
|
||||
if (auto *PlaceholderType = getType()->getAsPlaceholderType())
|
||||
if (PlaceholderType->isNonOverloadPlaceholderType())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// isKnownToHaveBooleanValue - Return true if this is an integer expression
|
||||
/// that is known to return 0 or 1. This happens for _Bool/bool expressions
|
||||
/// but also int expressions which are produced by things like comparisons in
|
||||
|
|
|
@ -1844,16 +1844,6 @@ def ObjCBoxable : Attr {
|
|||
let Documentation = [ObjCBoxableDocs];
|
||||
}
|
||||
|
||||
|
||||
// This is used to indicate that the type of the annotated variable's
|
||||
// initializer was changed from UnknownAny to 'id'.
|
||||
def ObjCDefaultedAnyToId : Attr {
|
||||
// This attribute has no spellings as it is only ever created implicitly.
|
||||
let Spellings = [];
|
||||
let Subjects = SubjectList<[Var]>;
|
||||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def OptimizeNone : InheritableAttr {
|
||||
let Spellings = [Clang<"optnone">];
|
||||
let Subjects = SubjectList<[Function, ObjCMethod]>;
|
||||
|
|
|
@ -10985,6 +10985,18 @@ QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl,
|
|||
return QualType();
|
||||
}
|
||||
|
||||
// Expressions default to 'id' when we're in a debugger.
|
||||
bool DefaultedAnyToId = false;
|
||||
if (getLangOpts().DebuggerCastResultToId &&
|
||||
Init->getType() == Context.UnknownAnyTy && !IsInitCapture) {
|
||||
ExprResult Result = forceUnknownAnyToType(Init, Context.getObjCIdType());
|
||||
if (Result.isInvalid()) {
|
||||
return QualType();
|
||||
}
|
||||
Init = Result.get();
|
||||
DefaultedAnyToId = true;
|
||||
}
|
||||
|
||||
// C++ [dcl.decomp]p1:
|
||||
// If the assignment-expression [...] has array type A and no ref-qualifier
|
||||
// is present, e has type cv A
|
||||
|
@ -11018,7 +11030,6 @@ QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl,
|
|||
// checks.
|
||||
// We only want to warn outside of template instantiations, though:
|
||||
// inside a template, the 'id' could have come from a parameter.
|
||||
bool DefaultedAnyToId = VDecl && VDecl->hasAttr<ObjCDefaultedAnyToIdAttr>();
|
||||
if (!inTemplateInstantiation() && !DefaultedAnyToId && !IsInitCapture &&
|
||||
!DeducedType.isNull() && DeducedType->isObjCIdType()) {
|
||||
SourceLocation Loc = TSI->getTypeLoc().getBeginLoc();
|
||||
|
@ -11097,27 +11108,6 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
|
|||
}
|
||||
Init = Res.get();
|
||||
|
||||
// Expressions default to 'id' when we're in a debugger
|
||||
// and we are assigning it to a variable of Objective-C pointer type.
|
||||
if (getLangOpts().DebuggerCastResultToId &&
|
||||
Init->getType() == Context.UnknownAnyTy) {
|
||||
ExprResult Result = forceUnknownAnyToType(Init, Context.getObjCIdType());
|
||||
if (Result.isInvalid()) {
|
||||
VDecl->setInvalidDecl();
|
||||
return;
|
||||
}
|
||||
Init = Result.get();
|
||||
VDecl->addAttr(ObjCDefaultedAnyToIdAttr::CreateImplicit(Context));
|
||||
} else if (!Init->getType().isNull() &&
|
||||
Init->hasNonOverloadPlaceholderType()) {
|
||||
Res = CheckPlaceholderExpr(Init).get();
|
||||
if (!Res.isUsable()) {
|
||||
VDecl->setInvalidDecl();
|
||||
return;
|
||||
}
|
||||
Init = Res.get();
|
||||
}
|
||||
|
||||
if (DeduceVariableDeclarationType(VDecl, DirectInit, Init))
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -6678,14 +6678,6 @@ Sema::MaybeConvertParenListExprToParenExpr(Scope *S, Expr *OrigExpr) {
|
|||
ExprResult Sema::ActOnParenListExpr(SourceLocation L,
|
||||
SourceLocation R,
|
||||
MultiExprArg Val) {
|
||||
for (size_t I = 0, E = Val.size(); I != E; ++I)
|
||||
if (Val[I]->hasNonOverloadPlaceholderType()) {
|
||||
ExprResult Result = CheckPlaceholderExpr(Val[I]);
|
||||
if (!Result.isUsable())
|
||||
return ExprError();
|
||||
Val[I] = Result.get();
|
||||
}
|
||||
|
||||
return ParenListExpr::Create(Context, L, Val, R);
|
||||
}
|
||||
|
||||
|
|
|
@ -1793,14 +1793,6 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
|
|||
NumInits = List->getNumExprs();
|
||||
}
|
||||
|
||||
for (unsigned I = 0, E = NumInits; I != E; ++I)
|
||||
if (Inits[I]->hasNonOverloadPlaceholderType()) {
|
||||
ExprResult Result = CheckPlaceholderExpr(Inits[I]);
|
||||
if (!Result.isUsable())
|
||||
return ExprError();
|
||||
Inits[I] = Result.get();
|
||||
}
|
||||
|
||||
// C++11 [expr.new]p15:
|
||||
// A new-expression that creates an object of type T initializes that
|
||||
// object as follows:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// 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
|
||||
// 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
|
||||
|
||||
@interface Test {
|
||||
@public
|
||||
|
@ -467,18 +467,6 @@ 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