summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2019-07-08 21:59:07 +0000
committerReid Kleckner <rnk@google.com>2019-07-08 21:59:07 +0000
commit345708b68118a9950c3d6958c562d6fe2c834be3 (patch)
tree673f0ec2c6d4768dc9e716ccd375d03701c803ce /clang/lib
parenta5ede3182bc07cf453c7b601dce0f0a8af2b624d (diff)
downloadbcm5719-llvm-345708b68118a9950c3d6958c562d6fe2c834be3.tar.gz
bcm5719-llvm-345708b68118a9950c3d6958c562d6fe2c834be3.zip
Revert [Sema] Resolve placeholder types before type deduction to silence spurious `-Warc-repeated-use-of-weak` warnings
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 llvm-svn: 365393
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp34
-rw-r--r--clang/lib/Sema/SemaExpr.cpp8
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp8
3 files changed, 12 insertions, 38 deletions
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:
OpenPOWER on IntegriCloud