Sema.cpp revision aa0cd85838f2a024e589ea4e8c2094130065af21
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the actions class which performs semantic analysis and
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// builds an AST out of a parse stream.
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
159c3087b0b0bea2fd782205c1274ebfc4290265e0John McCall#include "clang/Sema/SemaInternal.h"
169c3087b0b0bea2fd782205c1274ebfc4290265e0John McCall#include "clang/Sema/DelayedDiagnostic.h"
1782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov#include "TargetAttributesSema.h"
18e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn#include "llvm/ADT/DenseMap.h"
19e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl#include "llvm/ADT/SmallSet.h"
20680523a91dd3351389667c8de17121ba7ae82673John McCall#include "llvm/ADT/APFloat.h"
219257664568bf375b7790131a84d9a4fa30a5b7e3John McCall#include "llvm/Support/CrashRecoveryContext.h"
225f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/CXXFieldCollector.h"
239b623639378d53a675921ddfa7316034d571881eDouglas Gregor#include "clang/Sema/TemplateDeduction.h"
2476bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall#include "clang/Sema/ExternalSemaSource.h"
258c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl#include "clang/Sema/ObjCMethodList.h"
26f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "clang/Sema/PrettyDeclStackTrace.h"
275f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h"
28781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h"
2946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor#include "clang/Sema/SemaConsumer.h"
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h"
3179a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor#include "clang/AST/ASTDiagnostic.h"
32384aff8b94bb0d1ad6c5667b90621e5699815bb2John McCall#include "clang/AST/DeclCXX.h"
33f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper#include "clang/AST/DeclFriend.h"
34c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h"
35e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h"
36c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay#include "clang/AST/ExprCXX.h"
37ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner#include "clang/AST/StmtCXX.h"
3890db26000aefe9335370013eec64c85232d80227Douglas Gregor#include "clang/Lex/HeaderSearch.h"
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h"
40f7572a64a1e5f6f700527583ec5206a58ce6d9b6Douglas Gregor#include "clang/Basic/FileManager.h"
4191a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson#include "clang/Basic/PartialDiagnostic.h"
424d150c84514dbf15975960a3ea46bdf6b7f16a5bChris Lattner#include "clang/Basic/TargetInfo.h"
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
44781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema;
459ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
469ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorFunctionScopeInfo::~FunctionScopeInfo() { }
479ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
488fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidisvoid FunctionScopeInfo::Clear() {
49b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall  HasBranchProtectedScope = false;
50b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall  HasBranchIntoScope = false;
51b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall  HasIndirectGoto = false;
52b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall
539ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  SwitchStack.clear();
545077c3876beeaed32280af88244e8050078619a8Douglas Gregor  Returns.clear();
558fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  ErrorTrap.reset();
56351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  PossiblyUnreachableDiags.clear();
579ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
589ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
599ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorBlockScopeInfo::~BlockScopeInfo() { }
60ec9ea7200718478e8a976529defbe21942a11c9cEli FriedmanLambdaScopeInfo::~LambdaScopeInfo() { }
619ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
62ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisPrintingPolicy Sema::getPrintingPolicy(const ASTContext &Context,
63ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis                                       const Preprocessor &PP) {
648987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor  PrintingPolicy Policy = Context.getPrintingPolicy();
654e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  Policy.Bool = Context.getLangOpts().Bool;
668987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor  if (!Policy.Bool) {
678987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor    if (MacroInfo *BoolMacro = PP.getMacroInfo(&Context.Idents.get("bool"))) {
688987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor      Policy.Bool = BoolMacro->isObjectLike() &&
698987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor        BoolMacro->getNumTokens() == 1 &&
708987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor        BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
718987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor    }
728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor  }
738987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor
748987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor  return Policy;
758987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor}
768987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor
77c1a3e5e73859ece9f106ae9d84c78bef4111956aDouglas Gregorvoid Sema::ActOnTranslationUnitScope(Scope *S) {
788ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff  TUScope = S;
7944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  PushDeclContext(S, Context.getTranslationUnitDecl());
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81c7e04dad588a30c94648b9bd70cdbe25688d7629John McCall  VAListTagName = PP.getIdentifierInfo("__va_list_tag");
82b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
833b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff
84f807fe0d1a865f4c6ba7e494cf4ae360c4173521Douglas GregorSema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
85467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor           TranslationUnitKind TUKind,
863a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar           CodeCompleteConsumer *CodeCompleter)
874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  : TheTargetAttributesSema(0), FPFeatures(pp.getLangOpts()),
884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    LangOpts(pp.getLangOpts()), PP(pp), Context(ctxt), Consumer(consumer),
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()),
905d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth    CollectStats(false), ExternalSource(0), CodeCompleter(CodeCompleter),
913a387441ae339363ee5b254658f295e97bd9e913Argyrios Kyrtzidis    CurContext(0), OriginalLexicalContext(0),
923a387441ae339363ee5b254658f295e97bd9e913Argyrios Kyrtzidis    PackContext(0), MSStructPragmaOn(false), VisContext(0),
9380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall    ExprNeedsCleanups(false), LateTemplateParser(0), OpaqueParser(0),
94395e04dbd7294bae4640aef1705cec3d052578b0Sebastian Redl    IdResolver(pp), StdInitializerList(0), CXXTypeInfoDecl(0), MSVCGuidDecl(0),
95471131a05d4f9dca7f9f4f5109f2a9a4ce80bf65Benjamin Kramer    NSNumberDecl(0),
96471131a05d4f9dca7f9f4f5109f2a9a4ce80bf65Benjamin Kramer    NSStringDecl(0), StringWithUTF8StringMethod(0),
97471131a05d4f9dca7f9f4f5109f2a9a4ce80bf65Benjamin Kramer    NSArrayDecl(0), ArrayWithObjectsMethod(0),
98ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    NSDictionaryDecl(0), DictionaryWithObjectsMethod(0),
99b7566d8346ed8040a5cb7cefe96bd6ccbf015595Bill Wendling    GlobalNewDeleteDeclared(false),
1009a1ecf0522ccb7a45577f856150c15af0ee1df2aNico Weber    ObjCShouldCallSuperDealloc(false),
10180cb6e69d9e85231588ae604e4bc2bc9a07389afNico Weber    ObjCShouldCallSuperFinalize(false),
102467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    TUKind(TUKind),
10313489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall    NumSFINAEErrors(0), InFunctionDeclarator(0),
1041eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor    AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),
1058491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),
1068491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    CurrentInstantiationScope(0), TyposCorrected(0),
107b7566d8346ed8040a5cb7cefe96bd6ccbf015595Bill Wendling    AnalysisWarnings(*this)
108f35f828f9883123772a9731af190a608f3236ef4Douglas Gregor{
1093b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff  TUScope = 0;
110cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
111d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  LoadedExternalKnownNamespaces = false;
112ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  for (unsigned I = 0; I != NSAPI::NumNSNumberLiteralMethods; ++I)
113ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    NSNumberLiteralMethods[I] = 0;
114ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1154e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().ObjC1)
116ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    NSAPIObj.reset(new NSAPI(Context));
117ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1184e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().CPlusPlus)
11907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis    FieldCollector.reset(new CXXFieldCollector());
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12122caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner  // Tell diagnostics how to render things from the AST library.
12279a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor  PP.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument,
12379a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor                                       &Context);
1242afce7248b7a362f1e322ad18e43484d575b9c9dDouglas Gregor
1252afce7248b7a362f1e322ad18e43484d575b9c9dDouglas Gregor  ExprEvalContexts.push_back(
12676f3f69db1416425070177243e9f390122c553e0Richard Smith        ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0,
12776f3f69db1416425070177243e9f390122c553e0Richard Smith                                          false, 0, false));
128781472fe99a120098c631b0cbe33c89f8cef5e70John McCall
1298fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  FunctionScopes.push_back(new FunctionScopeInfo(Diags));
13046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor}
13146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
13246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregorvoid Sema::Initialize() {
13346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Tell the AST consumer about this Sema object.
13446ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  Consumer.Initialize(Context);
13546ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
13646ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // FIXME: Isn't this redundant with the initialization above?
13746ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
13846ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    SC->InitializeSema(*this);
13946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
14046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Tell the external Sema source about this Sema object.
14146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (ExternalSemaSource *ExternalSema
14246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor      = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
14346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    ExternalSema->InitializeSema(*this);
1444dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor
145772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  // Initialize predefined 128-bit integer types, if needed.
146772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (PP.getTargetInfo().getPointerWidth(0) >= 64) {
147772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    // If either of the 128-bit integer types are unavailable to name lookup,
148772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    // define them now.
149772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    DeclarationName Int128 = &Context.Idents.get("__int128_t");
150eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (IdResolver.begin(Int128) == IdResolver.end())
151772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      PushOnScopeChains(Context.getInt128Decl(), TUScope);
152772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
153772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    DeclarationName UInt128 = &Context.Idents.get("__uint128_t");
154eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (IdResolver.begin(UInt128) == IdResolver.end())
155772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      PushOnScopeChains(Context.getUInt128Decl(), TUScope);
156772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
157772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
158772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
1594dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  // Initialize predefined Objective-C types:
1604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (PP.getLangOpts().ObjC1) {
1617a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    // If 'SEL' does not yet refer to any declarations, make it refer to the
1627a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    // predefined 'SEL'.
1637a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    DeclarationName SEL = &Context.Idents.get("SEL");
164eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (IdResolver.begin(SEL) == IdResolver.end())
1657a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor      PushOnScopeChains(Context.getObjCSelDecl(), TUScope);
1667a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor
1674dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    // If 'id' does not yet refer to any declarations, make it refer to the
1684dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    // predefined 'id'.
1694dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    DeclarationName Id = &Context.Idents.get("id");
170eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (IdResolver.begin(Id) == IdResolver.end())
1714dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor      PushOnScopeChains(Context.getObjCIdDecl(), TUScope);
17279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor
17379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    // Create the built-in typedef for 'Class'.
17479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    DeclarationName Class = &Context.Idents.get("Class");
175eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (IdResolver.begin(Class) == IdResolver.end())
17679d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor      PushOnScopeChains(Context.getObjCClassDecl(), TUScope);
177a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor
178a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    // Create the built-in forward declaratino for 'Protocol'.
179a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    DeclarationName Protocol = &Context.Idents.get("Protocol");
180a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    if (IdResolver.begin(Protocol) == IdResolver.end())
181a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor      PushOnScopeChains(Context.getObjCProtocolDecl(), TUScope);
1824dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  }
183c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
184c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  DeclarationName BuiltinVaList = &Context.Idents.get("__builtin_va_list");
185c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge  if (IdResolver.begin(BuiltinVaList) == IdResolver.end())
186c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    PushOnScopeChains(Context.getBuiltinVaListDecl(), TUScope);
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
18982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovSema::~Sema() {
19082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  if (PackContext) FreePackedContext();
191aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  if (VisContext) FreeVisContext();
19282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  delete TheTargetAttributesSema;
19362c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian  MSStructPragmaOn = false;
194781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  // Kill all the active scopes.
195781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  for (unsigned I = 1, E = FunctionScopes.size(); I != E; ++I)
196781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    delete FunctionScopes[I];
197781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  if (FunctionScopes.size() == 1)
198781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    delete FunctionScopes[0];
19946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
20046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Tell the SemaConsumer to forget about us; we're going out of scope.
20146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
20246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    SC->ForgetSema();
20346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
20446ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Detach from the external Sema source.
20546ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (ExternalSemaSource *ExternalSema
206914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor        = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
20746ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    ExternalSema->ForgetSema();
20882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}
20982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
210f85e193739c953358c865005855253af4f68a497John McCall/// makeUnavailableInSystemHeader - There is an error in the current
211f85e193739c953358c865005855253af4f68a497John McCall/// context.  If we're still in a system header, and we can plausibly
212f85e193739c953358c865005855253af4f68a497John McCall/// make the relevant declaration unavailable instead of erroring, do
213f85e193739c953358c865005855253af4f68a497John McCall/// so and return true.
214f85e193739c953358c865005855253af4f68a497John McCallbool Sema::makeUnavailableInSystemHeader(SourceLocation loc,
2155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         StringRef msg) {
216f85e193739c953358c865005855253af4f68a497John McCall  // If we're not in a function, it's an error.
217f85e193739c953358c865005855253af4f68a497John McCall  FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext);
218f85e193739c953358c865005855253af4f68a497John McCall  if (!fn) return false;
219f85e193739c953358c865005855253af4f68a497John McCall
220f85e193739c953358c865005855253af4f68a497John McCall  // If we're in template instantiation, it's an error.
221f85e193739c953358c865005855253af4f68a497John McCall  if (!ActiveTemplateInstantiations.empty())
222f85e193739c953358c865005855253af4f68a497John McCall    return false;
223f85e193739c953358c865005855253af4f68a497John McCall
224f85e193739c953358c865005855253af4f68a497John McCall  // If that function's not in a system header, it's an error.
225f85e193739c953358c865005855253af4f68a497John McCall  if (!Context.getSourceManager().isInSystemHeader(loc))
226f85e193739c953358c865005855253af4f68a497John McCall    return false;
227f85e193739c953358c865005855253af4f68a497John McCall
228f85e193739c953358c865005855253af4f68a497John McCall  // If the function is already unavailable, it's not an error.
229f85e193739c953358c865005855253af4f68a497John McCall  if (fn->hasAttr<UnavailableAttr>()) return true;
230f85e193739c953358c865005855253af4f68a497John McCall
231f85e193739c953358c865005855253af4f68a497John McCall  fn->addAttr(new (Context) UnavailableAttr(loc, Context, msg));
232f85e193739c953358c865005855253af4f68a497John McCall  return true;
233f85e193739c953358c865005855253af4f68a497John McCall}
234f85e193739c953358c865005855253af4f68a497John McCall
23558a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian RedlASTMutationListener *Sema::getASTMutationListener() const {
23658a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl  return getASTConsumer().GetASTMutationListener();
23758a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl}
23858a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl
2395d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth/// \brief Print out statistics about the semantic analysis.
2405d98994c7749312a43ce6adf45537979a98e7afdChandler Carruthvoid Sema::PrintStats() const {
2415d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  llvm::errs() << "\n*** Semantic Analysis Stats:\n";
2425d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  llvm::errs() << NumSFINAEErrors << " SFINAE diagnostics trapped.\n";
2435d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth
2445d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  BumpAlloc.PrintStats();
2455d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  AnalysisWarnings.PrintStats();
2465d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth}
2475d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth
248c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
249c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith/// If there is already an implicit cast, merge into the existing one.
250c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith/// The result is of the given category.
251c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard SmithExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,
252c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith                                   CastKind Kind, ExprValueKind VK,
253c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith                                   const CXXCastPath *BasePath,
254c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith                                   CheckedConversionKind CCK) {
2559c129f818038e0269ba6b095722aa70176dc321dRichard Smith#ifndef NDEBUG
2569c129f818038e0269ba6b095722aa70176dc321dRichard Smith  if (VK == VK_RValue && !E->isRValue()) {
2579c129f818038e0269ba6b095722aa70176dc321dRichard Smith    switch (Kind) {
2589c129f818038e0269ba6b095722aa70176dc321dRichard Smith    default:
2599c129f818038e0269ba6b095722aa70176dc321dRichard Smith      assert(0 && "can't implicitly cast lvalue to rvalue with this cast kind");
2609c129f818038e0269ba6b095722aa70176dc321dRichard Smith    case CK_LValueToRValue:
2619c129f818038e0269ba6b095722aa70176dc321dRichard Smith    case CK_ArrayToPointerDecay:
2629c129f818038e0269ba6b095722aa70176dc321dRichard Smith    case CK_FunctionToPointerDecay:
2639c129f818038e0269ba6b095722aa70176dc321dRichard Smith    case CK_ToVoid:
2649c129f818038e0269ba6b095722aa70176dc321dRichard Smith      break;
2659c129f818038e0269ba6b095722aa70176dc321dRichard Smith    }
2669c129f818038e0269ba6b095722aa70176dc321dRichard Smith  }
267acdfa4d504a8f2514d60569f9ce55d45f11795b9Richard Smith  assert((VK == VK_RValue || !E->isRValue()) && "can't cast rvalue to lvalue");
2689c129f818038e0269ba6b095722aa70176dc321dRichard Smith#endif
2699c129f818038e0269ba6b095722aa70176dc321dRichard Smith
270429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley  QualType ExprTy = Context.getCanonicalType(E->getType());
2713a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang  QualType TypeTy = Context.getCanonicalType(Ty);
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2733a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang  if (ExprTy == TypeTy)
274429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley    return Owned(E);
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2764e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (getLangOpts().ObjCAutoRefCount)
277f85e193739c953358c865005855253af4f68a497John McCall    CheckObjCARCConversion(SourceRange(), Ty, E, CCK);
278f85e193739c953358c865005855253af4f68a497John McCall
2796fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor  // If this is a derived-to-base cast to a through a virtual base, we
2806fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor  // need a vtable.
2812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (Kind == CK_DerivedToBase &&
282f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      BasePathInvolvesVirtualBase(*BasePath)) {
283429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley    QualType T = E->getType();
2846fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor    if (const PointerType *Pointer = T->getAs<PointerType>())
2856fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor      T = Pointer->getPointeeType();
2866fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor    if (const RecordType *RecordTy = T->getAs<RecordType>())
287429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley      MarkVTableUsed(E->getLocStart(),
2886fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor                     cast<CXXRecordDecl>(RecordTy->getDecl()));
2896fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor  }
290c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith
291c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith  if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
292c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith    if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
293c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith      ImpCast->setType(Ty);
294c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith      ImpCast->setValueKind(VK);
295c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith      return Owned(E);
296c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith    }
2974c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson  }
2984c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson
299c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith  return Owned(ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK));
300906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl}
301906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl
302737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara/// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
303737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara/// to the conversion from scalar type ScalarTy to the Boolean type.
304737d5447b5d20633992ee5388eca5270c28c8ae7Abramo BagnaraCastKind Sema::ScalarTypeToBooleanCastKind(QualType ScalarTy) {
305737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  switch (ScalarTy->getScalarTypeKind()) {
306737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Bool: return CK_NoOp;
3071d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case Type::STK_CPointer: return CK_PointerToBoolean;
3081d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case Type::STK_BlockPointer: return CK_PointerToBoolean;
3091d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall  case Type::STK_ObjCObjectPointer: return CK_PointerToBoolean;
310737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_MemberPointer: return CK_MemberPointerToBoolean;
311737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Integral: return CK_IntegralToBoolean;
312737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Floating: return CK_FloatingToBoolean;
313737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_IntegralComplex: return CK_IntegralComplexToBoolean;
314737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_FloatingComplex: return CK_FloatingComplexToBoolean;
315737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  }
316737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  return CK_Invalid;
317737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara}
318737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara
319bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis/// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector.
320bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
321bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  if (D->isUsed())
322bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    return true;
323bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
324bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
325bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // UnusedFileScopedDecls stores the first declaration.
326bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // The declaration may have become definition so check again.
327bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    const FunctionDecl *DeclToCheck;
328bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (FD->hasBody(DeclToCheck))
329bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
330bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
331bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // Later redecls may add new information resulting in not having to warn,
332bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // so check again.
333ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    DeclToCheck = FD->getMostRecentDecl();
334bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (DeclToCheck != FD)
335bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
336bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  }
337bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
338bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
339bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // UnusedFileScopedDecls stores the first declaration.
340bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // The declaration may have become definition so check again.
341bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    const VarDecl *DeclToCheck = VD->getDefinition();
342bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (DeclToCheck)
343bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
344bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
345bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // Later redecls may add new information resulting in not having to warn,
346bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // so check again.
347ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    DeclToCheck = VD->getMostRecentDecl();
348bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (DeclToCheck != VD)
349bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
350bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  }
351bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
352bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  return false;
353bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
354bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
35515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCallnamespace {
35615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  struct UndefinedInternal {
35715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    NamedDecl *decl;
35815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    FullSourceLoc useLoc;
35915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
36015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    UndefinedInternal(NamedDecl *decl, FullSourceLoc useLoc)
36115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      : decl(decl), useLoc(useLoc) {}
36215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  };
36315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
36415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  bool operator<(const UndefinedInternal &l, const UndefinedInternal &r) {
36515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    return l.useLoc.isBeforeInTranslationUnitThan(r.useLoc);
36615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  }
36715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall}
36815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
36915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall/// checkUndefinedInternals - Check for undefined objects with internal linkage.
37015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCallstatic void checkUndefinedInternals(Sema &S) {
37115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  if (S.UndefinedInternals.empty()) return;
37215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
37315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  // Collect all the still-undefined entities with internal linkage.
3745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UndefinedInternal, 16> undefined;
37515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  for (llvm::DenseMap<NamedDecl*,SourceLocation>::iterator
37615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall         i = S.UndefinedInternals.begin(), e = S.UndefinedInternals.end();
37715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall       i != e; ++i) {
37815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    NamedDecl *decl = i->first;
37915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
38015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    // Ignore attributes that have become invalid.
38115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    if (decl->isInvalidDecl()) continue;
38215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
38315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    // __attribute__((weakref)) is basically a definition.
38415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    if (decl->hasAttr<WeakRefAttr>()) continue;
38515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
38615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    if (FunctionDecl *fn = dyn_cast<FunctionDecl>(decl)) {
38715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      if (fn->isPure() || fn->hasBody())
38815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall        continue;
38915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    } else {
39015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      if (cast<VarDecl>(decl)->hasDefinition() != VarDecl::DeclarationOnly)
39115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall        continue;
39215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    }
39315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
39415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    // We build a FullSourceLoc so that we can sort with array_pod_sort.
39515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    FullSourceLoc loc(i->second, S.Context.getSourceManager());
39615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    undefined.push_back(UndefinedInternal(decl, loc));
39715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  }
39815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
39915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  if (undefined.empty()) return;
40015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
40115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  // Sort (in order of use site) so that we're not (as) dependent on
40215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  // the iteration order through an llvm::DenseMap.
40315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  llvm::array_pod_sort(undefined.begin(), undefined.end());
40415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
4055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  for (SmallVectorImpl<UndefinedInternal>::iterator
40615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall         i = undefined.begin(), e = undefined.end(); i != e; ++i) {
40715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    NamedDecl *decl = i->decl;
40815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    S.Diag(decl->getLocation(), diag::warn_undefined_internal)
40915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      << isa<VarDecl>(decl) << decl;
41015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    S.Diag(i->useLoc, diag::note_used_here);
41115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  }
41215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall}
41315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
41431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregorvoid Sema::LoadExternalWeakUndeclaredIdentifiers() {
41531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  if (!ExternalSource)
41631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    return;
41731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
41831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  SmallVector<std::pair<IdentifierInfo *, WeakInfo>, 4> WeakIDs;
41931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs);
42031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  for (unsigned I = 0, N = WeakIDs.size(); I != N; ++I) {
42131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator Pos
42231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      = WeakUndeclaredIdentifiers.find(WeakIDs[I].first);
42331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    if (Pos != WeakUndeclaredIdentifiers.end())
42431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      continue;
42531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
42631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    WeakUndeclaredIdentifiers.insert(WeakIDs[I]);
42731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  }
42831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor}
42931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
430f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper
431f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jaspertypedef llvm::DenseMap<const CXXRecordDecl*, bool> RecordCompleteMap;
432f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper
433f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// \brief Returns true, if all methods and nested classes of the given
434f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// CXXRecordDecl are defined in this translation unit.
435f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper///
436f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// Should only be called from ActOnEndOfTranslationUnit so that all
437f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// definitions are actually read.
438f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasperstatic bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD,
439f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                                            RecordCompleteMap &MNCComplete) {
440f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  RecordCompleteMap::iterator Cache = MNCComplete.find(RD);
441f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  if (Cache != MNCComplete.end())
442f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    return Cache->second;
443f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  if (!RD->isCompleteDefinition())
444f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    return false;
445f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  bool Complete = true;
446f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  for (DeclContext::decl_iterator I = RD->decls_begin(),
447f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                                  E = RD->decls_end();
448f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper       I != E && Complete; ++I) {
449f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    if (const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I))
450f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      Complete = M->isDefined() || (M->isPure() && !isa<CXXDestructorDecl>(M));
4510e9e9f8d17e38b3c44f6e1323be3a812a793bdd1Daniel Jasper    else if (const FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(*I))
4520e9e9f8d17e38b3c44f6e1323be3a812a793bdd1Daniel Jasper      Complete = F->getTemplatedDecl()->isDefined();
453f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    else if (const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) {
454f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      if (R->isInjectedClassName())
455f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        continue;
456f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      if (R->hasDefinition())
457f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Complete = MethodsAndNestedClassesComplete(R->getDefinition(),
458f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                                                   MNCComplete);
459f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      else
460f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Complete = false;
461f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    }
462f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  }
463f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  MNCComplete[RD] = Complete;
464f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  return Complete;
465f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper}
466f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper
467f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// \brief Returns true, if the given CXXRecordDecl is fully defined in this
468f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// translation unit, i.e. all methods are defined or pure virtual and all
469f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// friends, friend functions and nested classes are fully defined in this
470f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// translation unit.
471f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper///
472f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// Should only be called from ActOnEndOfTranslationUnit so that all
473f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// definitions are actually read.
474f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasperstatic bool IsRecordFullyDefined(const CXXRecordDecl *RD,
475f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                                 RecordCompleteMap &RecordsComplete,
476f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                                 RecordCompleteMap &MNCComplete) {
477f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  RecordCompleteMap::iterator Cache = RecordsComplete.find(RD);
478f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  if (Cache != RecordsComplete.end())
479f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    return Cache->second;
480f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  bool Complete = MethodsAndNestedClassesComplete(RD, MNCComplete);
481f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  for (CXXRecordDecl::friend_iterator I = RD->friend_begin(),
482f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                                      E = RD->friend_end();
483f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper       I != E && Complete; ++I) {
484f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    // Check if friend classes and methods are complete.
485f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    if (TypeSourceInfo *TSI = (*I)->getFriendType()) {
486f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      // Friend classes are available as the TypeSourceInfo of the FriendDecl.
487f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      if (CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
488f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Complete = MethodsAndNestedClassesComplete(FriendD, MNCComplete);
489f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      else
490f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Complete = false;
491f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    } else {
492f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      // Friend functions are available through the NamedDecl of FriendDecl.
493f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      if (const FunctionDecl *FD =
494f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper          dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
495f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Complete = FD->isDefined();
496f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      else
497f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        // This is a template friend, give up.
498f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Complete = false;
499f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    }
500f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  }
501f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  RecordsComplete[RD] = Complete;
502f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  return Complete;
503f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper}
504f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper
5059299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// ActOnEndOfTranslationUnit - This is called at the very end of the
5069299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// translation unit when EOF is reached and all but the top-level scope is
5079299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// popped.
5080e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisvoid Sema::ActOnEndOfTranslationUnit() {
5099257664568bf375b7790131a84d9a4fa30a5b7e3John McCall  assert(DelayedDiagnostics.getCurrentPool() == NULL
5109257664568bf375b7790131a84d9a4fa30a5b7e3John McCall         && "reached end of translation unit with a pool attached?");
5119257664568bf375b7790131a84d9a4fa30a5b7e3John McCall
512467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  // Only complete translation units define vtables and perform implicit
513467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  // instantiations.
514467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  if (TUKind == TU_Complete) {
515849639d8b548519cc5a00c0c9253f0c0d525060dArgyrios Kyrtzidis    DiagnoseUseOfUnimplementedSelectors();
516849639d8b548519cc5a00c0c9253f0c0d525060dArgyrios Kyrtzidis
517aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    // If any dynamic classes have their key function defined within
518aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    // this translation unit, then those vtables are considered "used" and must
519aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    // be emitted.
520a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor    for (DynamicClassesType::iterator I = DynamicClasses.begin(ExternalSource),
521a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor                                      E = DynamicClasses.end();
522a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor         I != E; ++I) {
523a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor      assert(!(*I)->isDependentType() &&
524a5c6c2a84cde5c9b8f8ec0610a9f89ffd54f44eeAnders Carlsson             "Should not see dependent types here!");
525a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor      if (const CXXMethodDecl *KeyFunction = Context.getKeyFunction(*I)) {
526aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth        const FunctionDecl *Definition = 0;
527aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth        if (KeyFunction->hasBody(Definition))
528a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor          MarkVTableUsed(Definition->getLocation(), *I, true);
529aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth      }
530aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    }
531aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth
5328155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // If DefinedUsedVTables ends up marking any virtual member functions it
5338155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // might lead to more pending template instantiations, which we then need
5348155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // to instantiate.
5358155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    DefineUsedVTables();
5368155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky
5378155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // C++: Perform implicit template instantiations.
5388155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    //
5398155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // FIXME: When we perform these implicit instantiations, we do not
5408155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // carefully keep track of the point of instantiation (C++ [temp.point]).
5418155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // This means that name lookup that occurs within the template
5428155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // instantiation will always happen at the end of the translation unit,
5438155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // so it will find some names that should not be found. Although this is
5448155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // common behavior for C++ compilers, it is technically wrong. In the
5458155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // future, we either need to be able to filter the results of name lookup
5468155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // or we need to perform template instantiations earlier.
5478155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    PerformPendingInstantiations();
5482a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky  }
549d6a637f8c8a93863509fc1bc555513ff6504957dAnders Carlsson
55049b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis  // Remove file scoped decls that turned out to be used.
551a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor  UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(0,
552a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor                                                                         true),
553bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis                                             UnusedFileScopedDecls.end(),
554bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis                              std::bind1st(std::ptr_fun(ShouldRemoveFromUnused),
555bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis                                           this)),
55649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis                              UnusedFileScopedDecls.end());
55747268a3f2843a8d64f3a6fef1e9a9dde1feb4a8cDouglas Gregor
558467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  if (TUKind == TU_Prefix) {
559467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    // Translation unit prefixes don't need any of the checking below.
56087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    TUScope = 0;
56172b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis    return;
56287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  }
56372b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis
56463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner  // Check for #pragma weak identifiers that were never declared
56563d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner  // FIXME: This will cause diagnostics to be emitted in a non-determinstic
56663d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner  // order!  Iterating over a densemap like this is bad.
56731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  LoadExternalWeakUndeclaredIdentifiers();
568e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn  for (llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator
56963d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner       I = WeakUndeclaredIdentifiers.begin(),
57063d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner       E = WeakUndeclaredIdentifiers.end(); I != E; ++I) {
57163d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner    if (I->second.getUsed()) continue;
5721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57363d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner    Diag(I->second.getLocation(), diag::warn_weak_identifier_undeclared)
57463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      << I->first;
575e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn  }
576e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn
577467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  if (TUKind == TU_Module) {
57890db26000aefe9335370013eec64c85232d80227Douglas Gregor    // If we are building a module, resolve all of the exported declarations
57990db26000aefe9335370013eec64c85232d80227Douglas Gregor    // now.
58090db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Module *CurrentModule = PP.getCurrentModule()) {
58190db26000aefe9335370013eec64c85232d80227Douglas Gregor      ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
58290db26000aefe9335370013eec64c85232d80227Douglas Gregor
58390db26000aefe9335370013eec64c85232d80227Douglas Gregor      llvm::SmallVector<Module *, 2> Stack;
58490db26000aefe9335370013eec64c85232d80227Douglas Gregor      Stack.push_back(CurrentModule);
58590db26000aefe9335370013eec64c85232d80227Douglas Gregor      while (!Stack.empty()) {
58690db26000aefe9335370013eec64c85232d80227Douglas Gregor        Module *Mod = Stack.back();
58790db26000aefe9335370013eec64c85232d80227Douglas Gregor        Stack.pop_back();
58890db26000aefe9335370013eec64c85232d80227Douglas Gregor
58990db26000aefe9335370013eec64c85232d80227Douglas Gregor        // Resolve the exported declarations.
59090db26000aefe9335370013eec64c85232d80227Douglas Gregor        // FIXME: Actually complain, once we figure out how to teach the
59190db26000aefe9335370013eec64c85232d80227Douglas Gregor        // diagnostic client to deal with complains in the module map at this
59290db26000aefe9335370013eec64c85232d80227Douglas Gregor        // point.
59390db26000aefe9335370013eec64c85232d80227Douglas Gregor        ModMap.resolveExports(Mod, /*Complain=*/false);
59490db26000aefe9335370013eec64c85232d80227Douglas Gregor
59590db26000aefe9335370013eec64c85232d80227Douglas Gregor        // Queue the submodules, so their exports will also be resolved.
596b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor        for (Module::submodule_iterator Sub = Mod->submodule_begin(),
597b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor                                     SubEnd = Mod->submodule_end();
59890db26000aefe9335370013eec64c85232d80227Douglas Gregor             Sub != SubEnd; ++Sub) {
599b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor          Stack.push_back(*Sub);
60090db26000aefe9335370013eec64c85232d80227Douglas Gregor        }
60190db26000aefe9335370013eec64c85232d80227Douglas Gregor      }
60290db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
60390db26000aefe9335370013eec64c85232d80227Douglas Gregor
604467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    // Modules don't need any of the checking below.
605467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    TUScope = 0;
606467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    return;
607467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  }
608467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor
609275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  // C99 6.9.2p2:
610275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   A declaration of an identifier for an object that has file
611275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   scope without an initializer, and without a storage-class
612275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   specifier or with the storage-class specifier static,
613275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   constitutes a tentative definition. If a translation unit
614275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   contains one or more tentative definitions for an identifier,
615275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   and the translation unit contains no external definition for
616275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   that identifier, then the behavior is exactly as if the
617275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   translation unit contains a file scope declaration of that
618275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   identifier, with the composite type as of the end of the
619275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   translation unit, with an initializer equal to 0.
620e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl  llvm::SmallSet<VarDecl *, 32> Seen;
621a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  for (TentativeDefinitionsType::iterator
622a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor            T = TentativeDefinitions.begin(ExternalSource),
623a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor         TEnd = TentativeDefinitions.end();
624a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor       T != TEnd; ++T)
625a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  {
626a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor    VarDecl *VD = (*T)->getActingDefinition();
627e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl
628e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    // If the tentative definition was completed, getActingDefinition() returns
629e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    // null. If we've already seen this variable before, insert()'s second
630e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    // return value is false.
631e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    if (VD == 0 || VD->isInvalidDecl() || !Seen.insert(VD))
632b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor      continue;
633b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor
6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const IncompleteArrayType *ArrayT
635b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor        = Context.getAsIncompleteArrayType(VD->getType())) {
6361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (RequireCompleteType(VD->getLocation(),
637b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor                              ArrayT->getElementType(),
63863d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner                              diag::err_tentative_def_incomplete_type_arr)) {
639b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor        VD->setInvalidDecl();
64063d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner        continue;
641275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor      }
6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64363d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      // Set the length of the array to 1 (C99 6.9.2p5).
64463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);
64563d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true);
64646a617a792bfab0d9b1e057371ea3b9540802226John McCall      QualType T = Context.getConstantArrayType(ArrayT->getElementType(),
64746a617a792bfab0d9b1e057371ea3b9540802226John McCall                                                One, ArrayType::Normal, 0);
64863d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      VD->setType(T);
6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else if (RequireCompleteType(VD->getLocation(), VD->getType(),
650b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor                                   diag::err_tentative_def_incomplete_type))
651b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor      VD->setInvalidDecl();
652b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor
653b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor    // Notify the consumer that we've completed a tentative definition.
654b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor    if (!VD->isInvalidDecl())
655b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor      Consumer.CompleteTentativeDefinition(VD);
656b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor
657275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  }
65843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis
659c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt  if (LangOpts.CPlusPlus0x &&
660c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt      Diags.getDiagnosticLevel(diag::warn_delegating_ctor_cycle,
661c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt                               SourceLocation())
662d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie        != DiagnosticsEngine::Ignored)
663fe57eef44cc80e5bb51e4f484835be08b8d84256Sean Hunt    CheckDelegatingCtorCycles();
664fe57eef44cc80e5bb51e4f484835be08b8d84256Sean Hunt
66543f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis  // If there were errors, disable 'unused' warnings since they will mostly be
66643f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis  // noise.
66743f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis  if (!Diags.hasErrorOccurred()) {
66843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis    // Output warning for unused file scoped decls.
669a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor    for (UnusedFileScopedDeclsType::iterator
670a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor           I = UnusedFileScopedDecls.begin(ExternalSource),
67143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis           E = UnusedFileScopedDecls.end(); I != E; ++I) {
672a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor      if (ShouldRemoveFromUnused(this, *I))
673a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor        continue;
674a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor
67543f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
67643f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        const FunctionDecl *DiagD;
67743f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        if (!FD->hasBody(DiagD))
67843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis          DiagD = FD;
67948b89590f61575cbf365ba996a2bd1ba1561a4abArgyrios Kyrtzidis        if (DiagD->isDeleted())
68048b89590f61575cbf365ba996a2bd1ba1561a4abArgyrios Kyrtzidis          continue; // Deleted functions are supposed to be unused.
6816b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        if (DiagD->isReferenced()) {
6826b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          if (isa<CXXMethodDecl>(DiagD))
6836b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis            Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
6846b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                  << DiagD->getDeclName();
6856b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          else
6866b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis            Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
6876b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                  << /*function*/0 << DiagD->getDeclName();
6886b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        } else {
6896b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          Diag(DiagD->getLocation(),
6906b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis               isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function
6916b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                                         : diag::warn_unused_function)
6926b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                << DiagD->getDeclName();
6936b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        }
69443f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis      } else {
69543f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();
69643f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        if (!DiagD)
69743f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis          DiagD = cast<VarDecl>(*I);
6986b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        if (DiagD->isReferenced()) {
6996b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
7006b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                << /*variable*/1 << DiagD->getDeclName();
7016b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        } else {
7026b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          Diag(DiagD->getLocation(), diag::warn_unused_variable)
7036b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                << DiagD->getDeclName();
7046b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        }
70543f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis      }
706bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    }
70715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
70815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    checkUndefinedInternals(*this);
70949b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis  }
71087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
711f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  if (Diags.getDiagnosticLevel(diag::warn_unused_private_field,
712f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper                               SourceLocation())
713f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        != DiagnosticsEngine::Ignored) {
714f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    RecordCompleteMap RecordsComplete;
715f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    RecordCompleteMap MNCComplete;
716f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    for (NamedDeclSetType::iterator I = UnusedPrivateFields.begin(),
717f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper         E = UnusedPrivateFields.end(); I != E; ++I) {
718f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      const NamedDecl *D = *I;
719f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
720f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      if (RD && !RD->isUnion() &&
721f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper          IsRecordFullyDefined(RD, RecordsComplete, MNCComplete)) {
722f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper        Diag(D->getLocation(), diag::warn_unused_private_field)
723f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper              << D->getDeclName();
724f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper      }
725f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper    }
726f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper  }
727f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper
728483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  // Check we've noticed that we're no longer parsing the initializer for every
729483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  // variable. If we miss cases, then at best we have a performance issue and
730483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  // at worst a rejects-valid bug.
731483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  assert(ParsingInitForAutoVars.empty() &&
732483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith         "Didn't unmark var as having its initializer parsed");
733483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith
73487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  TUScope = 0;
7359299f3fa85796613cc787a2062c9562d07c8613eChris Lattner}
7369299f3fa85796613cc787a2062c9562d07c8613eChris Lattner
7379299f3fa85796613cc787a2062c9562d07c8613eChris Lattner
7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Helper functions.
7405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
7415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7428517d9b731f065cdfc55ec0f3ddf5d564d988648Anders CarlssonDeclContext *Sema::getFunctionLevelDeclContext() {
743db0ee1da16e9dbec19b144c9cd96ee9f55fe0c53John McCall  DeclContext *DC = CurContext;
7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74572899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman  while (true) {
74672899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC)) {
74772899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman      DC = DC->getParent();
74872899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    } else if (isa<CXXMethodDecl>(DC) &&
749215e4e17d00e12c38687a95502506d8f2ca3e646Douglas Gregor               cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
75072899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman               cast<CXXRecordDecl>(DC->getParent())->isLambda()) {
75172899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman      DC = DC->getParent()->getParent();
75272899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    }
75372899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    else break;
75472899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman  }
7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7568517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  return DC;
7578517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson}
7588517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson
759371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// getCurFunctionDecl - If inside of a function body, this returns a pointer
760371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// to the function decl for the function being parsed.  If we're currently
761371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// in a 'block', this returns the containing context.
762371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerFunctionDecl *Sema::getCurFunctionDecl() {
7638517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  DeclContext *DC = getFunctionLevelDeclContext();
764371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner  return dyn_cast<FunctionDecl>(DC);
765371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner}
766371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner
767c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel DunbarObjCMethodDecl *Sema::getCurMethodDecl() {
7688517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  DeclContext *DC = getFunctionLevelDeclContext();
769d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff  return dyn_cast<ObjCMethodDecl>(DC);
770c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar}
771371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner
772371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerNamedDecl *Sema::getCurFunctionOrMethodDecl() {
7738517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  DeclContext *DC = getFunctionLevelDeclContext();
774371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner  if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
7754afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor    return cast<NamedDecl>(DC);
776371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner  return 0;
777371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner}
778371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner
779393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbarvoid Sema::EmitCurrentDiagnostic(unsigned DiagID) {
780393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // FIXME: It doesn't make sense to me that DiagID is an incoming argument here
781393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // and yet we also use the current diag ID on the DiagnosticsEngine. This has
782393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // been made more painfully obvious by the refactor that introduced this
783393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // function, but it is possible that the incoming argument can be
784393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // eliminnated. If it truly cannot be (for example, there is some reentrancy
785393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // issue I am not seeing yet), then there should at least be a clarifying
786393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  // comment somewhere.
787393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  if (llvm::Optional<TemplateDeductionInfo*> Info = isSFINAEContext()) {
788393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar    switch (DiagnosticIDs::getDiagnosticSFINAEResponse(
789393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar              Diags.getCurrentDiagID())) {
79033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    case DiagnosticIDs::SFINAE_Report:
79177faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // We'll report the diagnostic below.
7929b623639378d53a675921ddfa7316034d571881eDouglas Gregor      break;
7939b623639378d53a675921ddfa7316034d571881eDouglas Gregor
79477faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith    case DiagnosticIDs::SFINAE_SubstitutionFailure:
79577faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // Count this failure so that we know that template argument deduction
79677faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // has failed.
797393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      ++NumSFINAEErrors;
798b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith
799b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      // Make a copy of this suppressed diagnostic and store it with the
800b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      // template-deduction information.
801b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
802b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith        Diagnostic DiagInfo(&Diags);
803b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith        (*Info)->addSFINAEDiagnostic(DiagInfo.getLocation(),
804b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith                       PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
805b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      }
806b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith
807393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.setLastDiagnosticIgnored();
808393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.Clear();
80977faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      return;
81077faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith
81177faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith    case DiagnosticIDs::SFINAE_AccessControl: {
8127822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // Per C++ Core Issue 1170, access control is part of SFINAE.
81300b43848e4a320b0845c1004694fa50920096c75Daniel Dunbar      // Additionally, the AccessCheckingSFINAE flag can be used to temporarily
8147822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // make access control a part of SFINAE for the purposes of checking
8157822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // type traits.
816393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      if (!AccessCheckingSFINAE && !getLangOpts().CPlusPlus0x)
8171eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor        break;
81877faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith
819393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      SourceLocation Loc = Diags.getCurrentDiagLoc();
82077faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith
82177faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // Suppress this diagnostic.
822393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      ++NumSFINAEErrors;
823b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith
824b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      // Make a copy of this suppressed diagnostic and store it with the
825b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      // template-deduction information.
826b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
827b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith        Diagnostic DiagInfo(&Diags);
828b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith        (*Info)->addSFINAEDiagnostic(DiagInfo.getLocation(),
829b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith                       PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
830b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      }
831b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith
832393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.setLastDiagnosticIgnored();
833393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.Clear();
83477faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith
83577faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // Now the diagnostic state is clear, produce a C++98 compatibility
83677faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // warning.
837393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
83877faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith
83977faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // The last diagnostic which Sema produced was ignored. Suppress any
84077faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith      // notes attached to it.
841393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.setLastDiagnosticIgnored();
8429b623639378d53a675921ddfa7316034d571881eDouglas Gregor      return;
84377faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith    }
84477faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith
84533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    case DiagnosticIDs::SFINAE_Suppress:
8469b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // Make a copy of this suppressed diagnostic and store it with the
8479b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // template-deduction information;
848b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      if (*Info) {
849b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith        Diagnostic DiagInfo(&Diags);
8501eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor        (*Info)->addSuppressedDiagnostic(DiagInfo.getLocation(),
851b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith                       PartialDiagnostic(DiagInfo, Context.getDiagAllocator()));
852b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      }
853b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith
854b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith      // Suppress this diagnostic.
855393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.setLastDiagnosticIgnored();
856393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      Diags.Clear();
8579b623639378d53a675921ddfa7316034d571881eDouglas Gregor      return;
8589b623639378d53a675921ddfa7316034d571881eDouglas Gregor    }
8599b623639378d53a675921ddfa7316034d571881eDouglas Gregor  }
8609b623639378d53a675921ddfa7316034d571881eDouglas Gregor
8618987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor  // Set up the context's printing policy based on our current state.
862393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  Context.setPrintingPolicy(getPrintingPolicy());
8638987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor
8649b623639378d53a675921ddfa7316034d571881eDouglas Gregor  // Emit the diagnostic.
865393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar  if (!Diags.EmitCurrentDiagnostic())
8665e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor    return;
8671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86825a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // If this is not a note, and we're in a template instantiation
86925a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // that is different from the last template instantiation where
87025a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // we emitted an error, print a template instantiation
87125a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // backtrace.
87233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  if (!DiagnosticIDs::isBuiltinNote(DiagID) &&
873393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      !ActiveTemplateInstantiations.empty() &&
874393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar      ActiveTemplateInstantiations.back()
875393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar        != LastTemplateInstantiationErrorContext) {
876393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar    PrintInstantiationStack();
877393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar    LastTemplateInstantiationErrorContext = ActiveTemplateInstantiations.back();
87825a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  }
87925a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor}
8802e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
88191a0cc913ecc5619b76d2e40742fd09725be8c56Anders CarlssonSema::SemaDiagnosticBuilder
88291a0cc913ecc5619b76d2e40742fd09725be8c56Anders CarlssonSema::Diag(SourceLocation Loc, const PartialDiagnostic& PD) {
88391a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  SemaDiagnosticBuilder Builder(Diag(Loc, PD.getDiagID()));
88491a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  PD.Emit(Builder);
8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
88691a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  return Builder;
88791a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson}
88891a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson
889108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// \brief Looks through the macro-expansion chain for the given
890108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// location, looking for a macro expansion with the given name.
891834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall/// If one is found, returns true and sets the location to that
892108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// expansion loc.
8935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) {
894834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  SourceLocation loc = locref;
895834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  if (!loc.isMacroID()) return false;
896834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall
897834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  // There's no good way right now to look at the intermediate
898108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth  // expansions, so just jump to the expansion location.
899402785357ab053dd53f4fdd858b9630a5e0f8badChandler Carruth  loc = getSourceManager().getExpansionLoc(loc);
900834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall
901834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  // If that's written with the name, stop here.
9025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<char, 16> buffer;
903834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  if (getPreprocessor().getSpelling(loc, buffer) == name) {
904834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall    locref = loc;
905834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall    return true;
906834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  }
907834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  return false;
908834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall}
909834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall
91023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// \brief Determines the active Scope associated with the given declaration
91123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// context.
91223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor///
91323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// This routine maps a declaration context to the active Scope object that
91423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// represents that declaration context in the parser. It is typically used
91523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// from "scope-less" code (e.g., template instantiation, lazy creation of
91623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// declarations) that injects a name for name-lookup purposes and, therefore,
91723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// must update the Scope.
91823c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor///
91923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// \returns The scope corresponding to the given declaraion context, or NULL
92023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// if no such scope is open.
92123c94dbb6631fecdb55ba401aa93722803d980c6Douglas GregorScope *Sema::getScopeForContext(DeclContext *Ctx) {
92223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor
92323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  if (!Ctx)
92423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor    return 0;
92523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor
92623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  Ctx = Ctx->getPrimaryContext();
92723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  for (Scope *S = getCurScope(); S; S = S->getParent()) {
928cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl    // Ignore scopes that cannot have declarations. This is important for
929cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl    // out-of-line definitions of static class members.
930cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl    if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
931cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl      if (DeclContext *Entity = static_cast<DeclContext *> (S->getEntity()))
932cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl        if (Ctx == Entity->getPrimaryContext())
933cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl          return S;
93423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  }
93523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor
93623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  return 0;
93723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor}
9389ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
9399ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// \brief Enter a new function scope
9409ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregorvoid Sema::PushFunctionScope() {
941781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  if (FunctionScopes.size() == 1) {
942781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    // Use the "top" function scope rather than having to allocate
943781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    // memory for a new scope.
9448fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis    FunctionScopes.back()->Clear();
945781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    FunctionScopes.push_back(FunctionScopes.back());
9469ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor    return;
9479ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  }
9489ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
9498fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  FunctionScopes.push_back(new FunctionScopeInfo(getDiagnostics()));
9509ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
9519ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
9529ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregorvoid Sema::PushBlockScope(Scope *BlockScope, BlockDecl *Block) {
9538fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  FunctionScopes.push_back(new BlockScopeInfo(getDiagnostics(),
9549ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor                                              BlockScope, Block));
9559ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
9569ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
95776e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregorvoid Sema::PushLambdaScope(CXXRecordDecl *Lambda,
95876e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor                           CXXMethodDecl *CallOperator) {
95976e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor  FunctionScopes.push_back(new LambdaScopeInfo(getDiagnostics(), Lambda,
96076e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor                                               CallOperator));
961ec9ea7200718478e8a976529defbe21942a11c9cEli Friedman}
962ec9ea7200718478e8a976529defbe21942a11c9cEli Friedman
963ec9ea7200718478e8a976529defbe21942a11c9cEli Friedmanvoid Sema::PopFunctionScopeInfo(const AnalysisBasedWarnings::Policy *WP,
964ec9ea7200718478e8a976529defbe21942a11c9cEli Friedman                                const Decl *D, const BlockExpr *blkExpr) {
9653ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek  FunctionScopeInfo *Scope = FunctionScopes.pop_back_val();
966781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  assert(!FunctionScopes.empty() && "mismatched push/pop!");
9673ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek
9683ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek  // Issue any analysis-based warnings.
9693ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek  if (WP && D)
970283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek    AnalysisWarnings.IssueWarnings(*WP, Scope, D, blkExpr);
971351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  else {
9725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    for (SmallVectorImpl<sema::PossiblyUnreachableDiag>::iterator
973351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek         i = Scope->PossiblyUnreachableDiags.begin(),
974351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek         e = Scope->PossiblyUnreachableDiags.end();
975351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek         i != e; ++i) {
976351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek      const sema::PossiblyUnreachableDiag &D = *i;
977351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek      Diag(D.Loc, D.PD);
978351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek    }
979351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  }
9803ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek
981351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  if (FunctionScopes.back() != Scope) {
982781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    delete Scope;
983351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  }
9849ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
9859ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
986625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenkovoid Sema::PushCompoundScope() {
987625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko  getCurFunction()->CompoundScopes.push_back(CompoundScopeInfo());
988625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko}
989625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko
990625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenkovoid Sema::PopCompoundScope() {
991625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko  FunctionScopeInfo *CurFunction = getCurFunction();
992625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko  assert(!CurFunction->CompoundScopes.empty() && "mismatched push/pop");
993625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko
994625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko  CurFunction->CompoundScopes.pop_back();
995625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko}
996625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko
9979ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// \brief Determine whether any errors occurred within this function/method/
9989ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// block.
999f85e193739c953358c865005855253af4f68a497John McCallbool Sema::hasAnyUnrecoverableErrorsInThisFunction() const {
1000f85e193739c953358c865005855253af4f68a497John McCall  return getCurFunction()->ErrorTrap.hasUnrecoverableErrorOccurred();
10019ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
10029ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
10039ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorBlockScopeInfo *Sema::getCurBlock() {
10049ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  if (FunctionScopes.empty())
10059ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor    return 0;
10069ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
10079ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  return dyn_cast<BlockScopeInfo>(FunctionScopes.back());
10089ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
100976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall
1010906a7e1c0f272f7e539c82dda01f4644031ce637Eli FriedmanLambdaScopeInfo *Sema::getCurLambda() {
1011906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman  if (FunctionScopes.empty())
1012906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman    return 0;
1013906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman
1014906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman  return dyn_cast<LambdaScopeInfo>(FunctionScopes.back());
1015906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman}
1016906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman
1017aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid Sema::ActOnComment(SourceRange Comment) {
1018aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  RawComment RC(SourceMgr, Comment);
1019aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  Context.addComment(RC);
1020aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
1021aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
102276bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall// Pin this vtable to this file.
102376bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCallExternalSemaSource::~ExternalSemaSource() {}
1024f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
10255ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregorvoid ExternalSemaSource::ReadMethodPool(Selector Sel) { }
10268c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl
1027d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregorvoid ExternalSemaSource::ReadKnownNamespaces(
10285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                           SmallVectorImpl<NamespaceDecl *> &Namespaces) {
1029d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor}
1030d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor
10315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid PrettyDeclStackTraceEntry::print(raw_ostream &OS) const {
1032f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  SourceLocation Loc = this->Loc;
1033f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation();
1034f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  if (Loc.isValid()) {
1035f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Loc.print(OS, S.getSourceManager());
1036f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    OS << ": ";
1037f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  }
1038f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  OS << Message;
1039f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
1040f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  if (TheDecl && isa<NamedDecl>(TheDecl)) {
1041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    std::string Name = cast<NamedDecl>(TheDecl)->getNameAsString();
1042f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    if (!Name.empty())
1043f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      OS << " '" << Name << '\'';
1044f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  }
1045f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
1046f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  OS << '\n';
1047f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall}
1048c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
1049c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \brief Figure out if an expression could be turned into a call.
1050c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
1051c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// Use this when trying to recover from an error where the programmer may have
1052c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// written just the name of a function instead of actually calling it.
1053c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
1054c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param E - The expression to examine.
1055c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param ZeroArgCallReturnTy - If the expression can be turned into a call
1056c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  with no arguments, this parameter is set to the type returned by such a
1057c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  call; otherwise, it is set to an empty QualType.
10586dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// \param OverloadSet - If the expression is an overloaded function
1059c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  name, this parameter is populated with the decls of the various overloads.
1060c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gaybool Sema::isExprCallable(const Expr &E, QualType &ZeroArgCallReturnTy,
10616dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                          UnresolvedSetImpl &OverloadSet) {
1062c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  ZeroArgCallReturnTy = QualType();
10636dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  OverloadSet.clear();
10646dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
10656dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  if (E.getType() == Context.OverloadTy) {
10666dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    OverloadExpr::FindResult FR = OverloadExpr::find(const_cast<Expr*>(&E));
10676dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    const OverloadExpr *Overloads = FR.Expression;
10686dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
1069c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    for (OverloadExpr::decls_iterator it = Overloads->decls_begin(),
1070c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay         DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) {
10716dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      OverloadSet.addDecl(*it);
10726dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
10736dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      // Check whether the function is a non-template which takes no
10746dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      // arguments.
10756dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      if (const FunctionDecl *OverloadDecl
10766dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall            = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
1077c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        if (OverloadDecl->getMinRequiredArguments() == 0)
1078c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay          ZeroArgCallReturnTy = OverloadDecl->getResultType();
1079c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      }
1080c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    }
10816dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
108264a371ff8d525880e519a43fc522cbdc79fc4a89Douglas Gregor    // Ignore overloads that are pointer-to-member constants.
108364a371ff8d525880e519a43fc522cbdc79fc4a89Douglas Gregor    if (FR.HasFormOfMemberPointer)
10846dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      return false;
10856dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
1086c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    return true;
1087c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
1088c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
10896dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  if (const DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E.IgnoreParens())) {
1090c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (const FunctionDecl *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
1091c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      if (Fun->getMinRequiredArguments() == 0)
1092c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        ZeroArgCallReturnTy = Fun->getResultType();
1093c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      return true;
1094c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    }
1095c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
1096c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
1097c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  // We don't have an expression that's convenient to get a FunctionDecl from,
1098c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  // but we can at least check if the type is "function of 0 arguments".
1099c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  QualType ExprTy = E.getType();
1100c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  const FunctionType *FunTy = NULL;
11019389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay  QualType PointeeTy = ExprTy->getPointeeType();
11029389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay  if (!PointeeTy.isNull())
11039389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay    FunTy = PointeeTy->getAs<FunctionType>();
1104c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (!FunTy)
1105c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    FunTy = ExprTy->getAs<FunctionType>();
1106c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (!FunTy && ExprTy == Context.BoundMemberTy) {
1107c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // Look for the bound-member type.  If it's still overloaded, give up,
1108c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // although we probably should have fallen into the OverloadExpr case above
1109c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // if we actually have an overloaded bound member.
1110c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    QualType BoundMemberTy = Expr::findBoundMemberType(&E);
1111c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (!BoundMemberTy.isNull())
1112c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      FunTy = BoundMemberTy->castAs<FunctionType>();
1113c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
1114c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
1115c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (const FunctionProtoType *FPT =
1116c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      dyn_cast_or_null<FunctionProtoType>(FunTy)) {
1117c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (FPT->getNumArgs() == 0)
1118c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      ZeroArgCallReturnTy = FunTy->getResultType();
1119c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    return true;
1120c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
1121c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  return false;
1122c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay}
1123c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
1124c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \brief Give notes for a set of overloads.
1125c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
1126c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// A companion to isExprCallable. In cases when the name that the programmer
1127c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// wrote was an overloaded function, we may be able to make some guesses about
1128c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// plausible overloads based on their return types; such guesses can be handed
1129c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// off to this method to be emitted as notes.
1130c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
1131c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param Overloads - The overloads to note.
1132c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param FinalNoteLoc - If we've suppressed printing some overloads due to
1133c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  -fshow-overloads=best, this is the location to attach to the note about too
1134c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  many candidates. Typically this will be the location of the original
1135c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  ill-formed expression.
11366dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads,
11376dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                          const SourceLocation FinalNoteLoc) {
1138c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  int ShownOverloads = 0;
1139c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  int SuppressedOverloads = 0;
1140c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  for (UnresolvedSetImpl::iterator It = Overloads.begin(),
1141c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay       DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
1142c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // FIXME: Magic number for max shown overloads stolen from
1143c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // OverloadCandidateSet::NoteCandidates.
1144c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (ShownOverloads >= 4 &&
11456dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall        S.Diags.getShowOverloads() == DiagnosticsEngine::Ovl_Best) {
1146c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      ++SuppressedOverloads;
1147c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      continue;
1148c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    }
11496dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
11506dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    NamedDecl *Fn = (*It)->getUnderlyingDecl();
11519c0e1ec7b3afd833c1b958ce2aeedff71c7eb4c5Abramo Bagnara    S.Diag(Fn->getLocation(), diag::note_possible_target_of_call);
1152c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    ++ShownOverloads;
1153c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
11546dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
1155c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (SuppressedOverloads)
11566dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    S.Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
11576dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      << SuppressedOverloads;
11586dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall}
11596dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
11606dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic void notePlausibleOverloads(Sema &S, SourceLocation Loc,
11616dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                                   const UnresolvedSetImpl &Overloads,
11626dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                                   bool (*IsPlausibleResult)(QualType)) {
11636dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  if (!IsPlausibleResult)
11646dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return noteOverloads(S, Overloads, Loc);
11656dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
11666dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  UnresolvedSet<2> PlausibleOverloads;
11676dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  for (OverloadExpr::decls_iterator It = Overloads.begin(),
11686dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall         DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
11696dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It);
11706dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    QualType OverloadResultTy = OverloadDecl->getResultType();
11716dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    if (IsPlausibleResult(OverloadResultTy))
11726dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      PlausibleOverloads.addDecl(It.getDecl());
11736dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  }
11746dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  noteOverloads(S, PlausibleOverloads, Loc);
11756dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall}
11766dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
11776dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// Determine whether the given expression can be called by just
11786dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// putting parentheses after it.  Notably, expressions with unary
11796dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// operators can't be because the unary operator will start parsing
11806dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// outside the call.
11816dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic bool IsCallableWithAppend(Expr *E) {
11826dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  E = E->IgnoreImplicit();
11836dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  return (!isa<CStyleCastExpr>(E) &&
11846dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall          !isa<UnaryOperator>(E) &&
11856dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall          !isa<BinaryOperator>(E) &&
11866dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall          !isa<CXXOperatorCallExpr>(E));
11876dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall}
11886dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
11896dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallbool Sema::tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD,
11906dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                                bool ForceComplain,
11916dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                                bool (*IsPlausibleResult)(QualType)) {
11926dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  SourceLocation Loc = E.get()->getExprLoc();
11936dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  SourceRange Range = E.get()->getSourceRange();
11946dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
11956dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  QualType ZeroArgCallTy;
11966dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  UnresolvedSet<4> Overloads;
11976dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  if (isExprCallable(*E.get(), ZeroArgCallTy, Overloads) &&
11986dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      !ZeroArgCallTy.isNull() &&
11996dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
12006dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    // At this point, we know E is potentially callable with 0
12016dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    // arguments and that it returns something of a reasonable type,
12026dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    // so we can emit a fixit and carry on pretending that E was
12036dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    // actually a CallExpr.
12046dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    SourceLocation ParenInsertionLoc =
12056dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      PP.getLocForEndOfToken(Range.getEnd());
12066dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    Diag(Loc, PD)
12076dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      << /*zero-arg*/ 1 << Range
12086dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall      << (IsCallableWithAppend(E.get())
12096dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall          ? FixItHint::CreateInsertion(ParenInsertionLoc, "()")
12106dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall          : FixItHint());
12116dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
12126dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
12136dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    // FIXME: Try this before emitting the fixit, and suppress diagnostics
12146dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    // while doing so.
12156dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    E = ActOnCallExpr(0, E.take(), ParenInsertionLoc,
12166dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                      MultiExprArg(*this, 0, 0),
12176dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall                      ParenInsertionLoc.getLocWithOffset(1));
12186dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall    return true;
12196dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  }
12206dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
12216dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  if (!ForceComplain) return false;
12226dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall
12236dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  Diag(Loc, PD) << /*not zero-arg*/ 0 << Range;
12246dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult);
12256dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  E = ExprError();
12266dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall  return true;
1227c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay}
1228