summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/AST/Expr.h9
-rw-r--r--clang/include/clang/Basic/Attr.td10
-rw-r--r--clang/lib/Sema/SemaDecl.cpp34
-rw-r--r--clang/lib/Sema/SemaExpr.cpp8
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp8
-rw-r--r--clang/test/SemaObjC/arc-repeated-weak.mm16
6 files changed, 14 insertions, 71 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 1d4a847422e..d44a815c869 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -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
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index c70e5dfdb5b..93913b043ec 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -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]>;
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index f2838df6923..03b6cc91657 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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;
}
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index f44235491d6..466d9fdb9b9 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -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);
}
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 5a71443e792..32b35ba7c32 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -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:
diff --git a/clang/test/SemaObjC/arc-repeated-weak.mm b/clang/test/SemaObjC/arc-repeated-weak.mm
index 6c7a6292f99..4eec4d2fe69 100644
--- a/clang/test/SemaObjC/arc-repeated-weak.mm
+++ b/clang/test/SemaObjC/arc-repeated-weak.mm
@@ -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.
OpenPOWER on IntegriCloud