]> granicus.if.org Git - clang/commitdiff
Revert [Sema] Resolve placeholder types before type deduction to silence spurious...
authorReid Kleckner <rnk@google.com>
Mon, 8 Jul 2019 21:59:07 +0000 (21:59 +0000)
committerReid Kleckner <rnk@google.com>
Mon, 8 Jul 2019 21:59:07 +0000 (21:59 +0000)
This reverts r365382 (git commit 8b1becf2e31d9170ee356a19c7b6ea991d3a520f)

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365393 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
include/clang/Basic/Attr.td
lib/Sema/SemaDecl.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprCXX.cpp
test/SemaObjC/arc-repeated-weak.mm

index 1d4a847422ecfc09c774c50cd5d36802d3f8a8bf..d44a815c8699ea3efa9b62744744cf815ab84c18 100644 (file)
@@ -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
index c70e5dfdb5bfbd59022c17893951fec9e27ee6a3..93913b043ec8ac1204fdfda8f88319d4519df00b 100644 (file)
@@ -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]>;
index f2838df6923505fbde53dc58f0dbba099f77f45e..03b6cc916570833dcd21d5eec5e8166fe70bec55 100644 (file)
@@ -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;
   }
index f44235491d6e945a505831d636f692d21cfb5253..466d9fdb9b974c47d6ca88e19c1cf30e160cd186 100644 (file)
@@ -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);
 }
 
index 5a71443e7924b0217f6668df00dd91e885d67370..32b35ba7c32b0ca9c76767195baed169c7d9f8e7 100644 (file)
@@ -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:
index 6c7a6292f992cbebf95881e0001b4cc1caace514..4eec4d2fe69c790157fac9ecbcd58e1a593386a2 100644 (file)
@@ -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.