Sema.cpp revision 467dc88512b4ba4bb16e274ea3771dc1415d31da
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"
215f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/CXXFieldCollector.h"
229b623639378d53a675921ddfa7316034d571881eDouglas Gregor#include "clang/Sema/TemplateDeduction.h"
2376bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall#include "clang/Sema/ExternalSemaSource.h"
248c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl#include "clang/Sema/ObjCMethodList.h"
25f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "clang/Sema/PrettyDeclStackTrace.h"
265f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h"
27781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h"
2846ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor#include "clang/Sema/SemaConsumer.h"
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h"
3079a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor#include "clang/AST/ASTDiagnostic.h"
31384aff8b94bb0d1ad6c5667b90621e5699815bb2John McCall#include "clang/AST/DeclCXX.h"
32c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h"
33e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h"
34c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay#include "clang/AST/ExprCXX.h"
35ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner#include "clang/AST/StmtCXX.h"
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h"
3791a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson#include "clang/Basic/PartialDiagnostic.h"
384d150c84514dbf15975960a3ea46bdf6b7f16a5bChris Lattner#include "clang/Basic/TargetInfo.h"
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
40781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema;
419ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
429ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorFunctionScopeInfo::~FunctionScopeInfo() { }
439ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
448fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidisvoid FunctionScopeInfo::Clear() {
45b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall  HasBranchProtectedScope = false;
46b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall  HasBranchIntoScope = false;
47b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall  HasIndirectGoto = false;
48b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall
499ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  SwitchStack.clear();
505077c3876beeaed32280af88244e8050078619a8Douglas Gregor  Returns.clear();
518fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  ErrorTrap.reset();
52351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  PossiblyUnreachableDiags.clear();
539ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
549ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
559ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorBlockScopeInfo::~BlockScopeInfo() { }
569ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
57c1a3e5e73859ece9f106ae9d84c78bef4111956aDouglas Gregorvoid Sema::ActOnTranslationUnitScope(Scope *S) {
588ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff  TUScope = S;
5944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  PushDeclContext(S, Context.getTranslationUnitDecl());
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61c7e04dad588a30c94648b9bd70cdbe25688d7629John McCall  VAListTagName = PP.getIdentifierInfo("__va_list_tag");
62c7e04dad588a30c94648b9bd70cdbe25688d7629John McCall
63772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (PP.getLangOptions().ObjC1) {
64772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    // Synthesize "@class Protocol;
65772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    if (Context.getObjCProtoType().isNull()) {
66772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      ObjCInterfaceDecl *ProtocolDecl =
67772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor        ObjCInterfaceDecl::Create(Context, CurContext, SourceLocation(),
68772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                  &Context.Idents.get("Protocol"),
69772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor                                  SourceLocation(), true);
70772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl));
71772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      PushOnScopeChains(ProtocolDecl, TUScope, false);
72772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    }
734d150c84514dbf15975960a3ea46bdf6b7f16a5bChris Lattner  }
74b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
753b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff
76f807fe0d1a865f4c6ba7e494cf4ae360c4173521Douglas GregorSema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
77467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor           TranslationUnitKind TUKind,
783a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar           CodeCompleteConsumer *CodeCompleter)
79321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  : TheTargetAttributesSema(0), FPFeatures(pp.getLangOptions()),
8082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov    LangOpts(pp.getLangOptions()), PP(pp), Context(ctxt), Consumer(consumer),
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()),
825d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth    CollectStats(false), ExternalSource(0), CodeCompleter(CodeCompleter),
835d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth    CurContext(0), PackContext(0), MSStructPragmaOn(false), VisContext(0),
84f85e193739c953358c865005855253af4f68a497John McCall    ExprNeedsCleanups(0), LateTemplateParser(0), OpaqueParser(0),
854eb4f0f96289cbece50c1270e02af3caf8779705Douglas Gregor    IdResolver(pp.getLangOptions()), CXXTypeInfoDecl(0), MSVCGuidDecl(0),
86b7566d8346ed8040a5cb7cefe96bd6ccbf015595Bill Wendling    GlobalNewDeleteDeclared(false),
879a1ecf0522ccb7a45577f856150c15af0ee1df2aNico Weber    ObjCShouldCallSuperDealloc(false),
88467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    TUKind(TUKind),
891eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor    NumSFINAEErrors(0), SuppressAccessChecking(false),
901eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor    AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),
918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),
928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    CurrentInstantiationScope(0), TyposCorrected(0),
93b7566d8346ed8040a5cb7cefe96bd6ccbf015595Bill Wendling    AnalysisWarnings(*this)
94f35f828f9883123772a9731af190a608f3236ef4Douglas Gregor{
953b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff  TUScope = 0;
96d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  LoadedExternalKnownNamespaces = false;
97d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor
9807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis  if (getLangOptions().CPlusPlus)
9907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis    FieldCollector.reset(new CXXFieldCollector());
1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10122caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner  // Tell diagnostics how to render things from the AST library.
10279a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor  PP.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument,
10379a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor                                       &Context);
1042afce7248b7a362f1e322ad18e43484d575b9c9dDouglas Gregor
1052afce7248b7a362f1e322ad18e43484d575b9c9dDouglas Gregor  ExprEvalContexts.push_back(
106f85e193739c953358c865005855253af4f68a497John McCall        ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0, false));
107781472fe99a120098c631b0cbe33c89f8cef5e70John McCall
1088fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  FunctionScopes.push_back(new FunctionScopeInfo(Diags));
10946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor}
11046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
11146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregorvoid Sema::Initialize() {
11246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Tell the AST consumer about this Sema object.
11346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  Consumer.Initialize(Context);
11446ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
11546ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // FIXME: Isn't this redundant with the initialization above?
11646ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
11746ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    SC->InitializeSema(*this);
11846ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
11946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Tell the external Sema source about this Sema object.
12046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (ExternalSemaSource *ExternalSema
12146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor      = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
12246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    ExternalSema->InitializeSema(*this);
1234dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor
124772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  // Initialize predefined 128-bit integer types, if needed.
125772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  if (PP.getTargetInfo().getPointerWidth(0) >= 64) {
126772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    // If either of the 128-bit integer types are unavailable to name lookup,
127772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    // define them now.
128772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    DeclarationName Int128 = &Context.Idents.get("__int128_t");
129772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    if (IdentifierResolver::begin(Int128) == IdentifierResolver::end())
130772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      PushOnScopeChains(Context.getInt128Decl(), TUScope);
131772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
132772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    DeclarationName UInt128 = &Context.Idents.get("__uint128_t");
133772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    if (IdentifierResolver::begin(UInt128) == IdentifierResolver::end())
134772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor      PushOnScopeChains(Context.getUInt128Decl(), TUScope);
135772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor  }
136772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
137772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
1384dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  // Initialize predefined Objective-C types:
1394dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  if (PP.getLangOptions().ObjC1) {
1407a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    // If 'SEL' does not yet refer to any declarations, make it refer to the
1417a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    // predefined 'SEL'.
1427a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    DeclarationName SEL = &Context.Idents.get("SEL");
1437a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor    if (IdentifierResolver::begin(SEL) == IdentifierResolver::end())
1447a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor      PushOnScopeChains(Context.getObjCSelDecl(), TUScope);
1457a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor
1464dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    // If 'id' does not yet refer to any declarations, make it refer to the
1474dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    // predefined 'id'.
1484dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    DeclarationName Id = &Context.Idents.get("id");
1494dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    if (IdentifierResolver::begin(Id) == IdentifierResolver::end())
1504dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor      PushOnScopeChains(Context.getObjCIdDecl(), TUScope);
15179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor
15279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    // Create the built-in typedef for 'Class'.
15379d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    DeclarationName Class = &Context.Idents.get("Class");
15479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor    if (IdentifierResolver::begin(Class) == IdentifierResolver::end())
15579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor      PushOnScopeChains(Context.getObjCClassDecl(), TUScope);
1564dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor  }
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
15982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovSema::~Sema() {
16082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  if (PackContext) FreePackedContext();
161aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  if (VisContext) FreeVisContext();
16282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov  delete TheTargetAttributesSema;
16362c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian  MSStructPragmaOn = false;
164781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  // Kill all the active scopes.
165781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  for (unsigned I = 1, E = FunctionScopes.size(); I != E; ++I)
166781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    delete FunctionScopes[I];
167781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  if (FunctionScopes.size() == 1)
168781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    delete FunctionScopes[0];
16946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
17046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Tell the SemaConsumer to forget about us; we're going out of scope.
17146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer))
17246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    SC->ForgetSema();
17346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor
17446ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  // Detach from the external Sema source.
17546ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor  if (ExternalSemaSource *ExternalSema
176914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor        = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
17746ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor    ExternalSema->ForgetSema();
17882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}
17982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov
180f85e193739c953358c865005855253af4f68a497John McCall
181f85e193739c953358c865005855253af4f68a497John McCall/// makeUnavailableInSystemHeader - There is an error in the current
182f85e193739c953358c865005855253af4f68a497John McCall/// context.  If we're still in a system header, and we can plausibly
183f85e193739c953358c865005855253af4f68a497John McCall/// make the relevant declaration unavailable instead of erroring, do
184f85e193739c953358c865005855253af4f68a497John McCall/// so and return true.
185f85e193739c953358c865005855253af4f68a497John McCallbool Sema::makeUnavailableInSystemHeader(SourceLocation loc,
1865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         StringRef msg) {
187f85e193739c953358c865005855253af4f68a497John McCall  // If we're not in a function, it's an error.
188f85e193739c953358c865005855253af4f68a497John McCall  FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext);
189f85e193739c953358c865005855253af4f68a497John McCall  if (!fn) return false;
190f85e193739c953358c865005855253af4f68a497John McCall
191f85e193739c953358c865005855253af4f68a497John McCall  // If we're in template instantiation, it's an error.
192f85e193739c953358c865005855253af4f68a497John McCall  if (!ActiveTemplateInstantiations.empty())
193f85e193739c953358c865005855253af4f68a497John McCall    return false;
194f85e193739c953358c865005855253af4f68a497John McCall
195f85e193739c953358c865005855253af4f68a497John McCall  // If that function's not in a system header, it's an error.
196f85e193739c953358c865005855253af4f68a497John McCall  if (!Context.getSourceManager().isInSystemHeader(loc))
197f85e193739c953358c865005855253af4f68a497John McCall    return false;
198f85e193739c953358c865005855253af4f68a497John McCall
199f85e193739c953358c865005855253af4f68a497John McCall  // If the function is already unavailable, it's not an error.
200f85e193739c953358c865005855253af4f68a497John McCall  if (fn->hasAttr<UnavailableAttr>()) return true;
201f85e193739c953358c865005855253af4f68a497John McCall
202f85e193739c953358c865005855253af4f68a497John McCall  fn->addAttr(new (Context) UnavailableAttr(loc, Context, msg));
203f85e193739c953358c865005855253af4f68a497John McCall  return true;
204f85e193739c953358c865005855253af4f68a497John McCall}
205f85e193739c953358c865005855253af4f68a497John McCall
20658a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian RedlASTMutationListener *Sema::getASTMutationListener() const {
20758a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl  return getASTConsumer().GetASTMutationListener();
20858a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl}
20958a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl
2105d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth/// \brief Print out statistics about the semantic analysis.
2115d98994c7749312a43ce6adf45537979a98e7afdChandler Carruthvoid Sema::PrintStats() const {
2125d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  llvm::errs() << "\n*** Semantic Analysis Stats:\n";
2135d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  llvm::errs() << NumSFINAEErrors << " SFINAE diagnostics trapped.\n";
2145d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth
2155d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  BumpAlloc.PrintStats();
2165d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth  AnalysisWarnings.PrintStats();
2175d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth}
2185d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
2201e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner/// If there is already an implicit cast, merge into the existing one.
221906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl/// The result is of the given category.
222429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn WiegleyExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,
223429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley                                   CastKind Kind, ExprValueKind VK,
224f85e193739c953358c865005855253af4f68a497John McCall                                   const CXXCastPath *BasePath,
225f85e193739c953358c865005855253af4f68a497John McCall                                   CheckedConversionKind CCK) {
226429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley  QualType ExprTy = Context.getCanonicalType(E->getType());
2273a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang  QualType TypeTy = Context.getCanonicalType(Ty);
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2293a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang  if (ExprTy == TypeTy)
230429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley    return Owned(E);
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
232f85e193739c953358c865005855253af4f68a497John McCall  if (getLangOptions().ObjCAutoRefCount)
233f85e193739c953358c865005855253af4f68a497John McCall    CheckObjCARCConversion(SourceRange(), Ty, E, CCK);
234f85e193739c953358c865005855253af4f68a497John McCall
2356fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor  // If this is a derived-to-base cast to a through a virtual base, we
2366fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor  // need a vtable.
2372de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (Kind == CK_DerivedToBase &&
238f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      BasePathInvolvesVirtualBase(*BasePath)) {
239429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley    QualType T = E->getType();
2406fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor    if (const PointerType *Pointer = T->getAs<PointerType>())
2416fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor      T = Pointer->getPointeeType();
2426fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor    if (const RecordType *RecordTy = T->getAs<RecordType>())
243429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley      MarkVTableUsed(E->getLocStart(),
2446fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor                     cast<CXXRecordDecl>(RecordTy->getDecl()));
2456fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor  }
2466fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor
247429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley  if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
248f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
2494c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson      ImpCast->setType(Ty);
2505baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall      ImpCast->setValueKind(VK);
251429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley      return Owned(E);
2524c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson    }
2534c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson  }
2544c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson
255429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley  return Owned(ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK));
256906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl}
257906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl
258737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara/// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
259737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara/// to the conversion from scalar type ScalarTy to the Boolean type.
260737d5447b5d20633992ee5388eca5270c28c8ae7Abramo BagnaraCastKind Sema::ScalarTypeToBooleanCastKind(QualType ScalarTy) {
261737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  switch (ScalarTy->getScalarTypeKind()) {
262737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Bool: return CK_NoOp;
263737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Pointer: return CK_PointerToBoolean;
264737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_MemberPointer: return CK_MemberPointerToBoolean;
265737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Integral: return CK_IntegralToBoolean;
266737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_Floating: return CK_FloatingToBoolean;
267737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_IntegralComplex: return CK_IntegralComplexToBoolean;
268737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  case Type::STK_FloatingComplex: return CK_FloatingComplexToBoolean;
269737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  }
270737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara  return CK_Invalid;
271737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara}
272737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara
2735baba9d98364a3525d6afa15a04cdad82fd6dd30John McCallExprValueKind Sema::CastCategory(Expr *E) {
274906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl  Expr::Classification Classification = E->Classify(Context);
2755baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  return Classification.isRValue() ? VK_RValue :
2765baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall      (Classification.isLValue() ? VK_LValue : VK_XValue);
2771e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner}
2781e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner
279bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis/// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector.
280bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
281bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  if (D->isUsed())
282bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    return true;
283bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
284bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
285bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // UnusedFileScopedDecls stores the first declaration.
286bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // The declaration may have become definition so check again.
287bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    const FunctionDecl *DeclToCheck;
288bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (FD->hasBody(DeclToCheck))
289bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
290bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
291bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // Later redecls may add new information resulting in not having to warn,
292bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // so check again.
293bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    DeclToCheck = FD->getMostRecentDeclaration();
294bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (DeclToCheck != FD)
295bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
296bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  }
297bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
298bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
299bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // UnusedFileScopedDecls stores the first declaration.
300bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // The declaration may have become definition so check again.
301bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    const VarDecl *DeclToCheck = VD->getDefinition();
302bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (DeclToCheck)
303bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
304bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
305bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // Later redecls may add new information resulting in not having to warn,
306bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    // so check again.
307bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    DeclToCheck = VD->getMostRecentDeclaration();
308bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    if (DeclToCheck != VD)
309bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
310bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  }
311bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
312bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  return false;
313bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
314bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
31515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCallnamespace {
31615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  struct UndefinedInternal {
31715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    NamedDecl *decl;
31815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    FullSourceLoc useLoc;
31915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
32015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    UndefinedInternal(NamedDecl *decl, FullSourceLoc useLoc)
32115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      : decl(decl), useLoc(useLoc) {}
32215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  };
32315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
32415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  bool operator<(const UndefinedInternal &l, const UndefinedInternal &r) {
32515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    return l.useLoc.isBeforeInTranslationUnitThan(r.useLoc);
32615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  }
32715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall}
32815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
32915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall/// checkUndefinedInternals - Check for undefined objects with internal linkage.
33015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCallstatic void checkUndefinedInternals(Sema &S) {
33115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  if (S.UndefinedInternals.empty()) return;
33215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
33315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  // Collect all the still-undefined entities with internal linkage.
3345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UndefinedInternal, 16> undefined;
33515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  for (llvm::DenseMap<NamedDecl*,SourceLocation>::iterator
33615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall         i = S.UndefinedInternals.begin(), e = S.UndefinedInternals.end();
33715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall       i != e; ++i) {
33815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    NamedDecl *decl = i->first;
33915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
34015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    // Ignore attributes that have become invalid.
34115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    if (decl->isInvalidDecl()) continue;
34215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
34315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    // __attribute__((weakref)) is basically a definition.
34415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    if (decl->hasAttr<WeakRefAttr>()) continue;
34515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
34615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    if (FunctionDecl *fn = dyn_cast<FunctionDecl>(decl)) {
34715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      if (fn->isPure() || fn->hasBody())
34815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall        continue;
34915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    } else {
35015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      if (cast<VarDecl>(decl)->hasDefinition() != VarDecl::DeclarationOnly)
35115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall        continue;
35215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    }
35315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
35415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    // We build a FullSourceLoc so that we can sort with array_pod_sort.
35515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    FullSourceLoc loc(i->second, S.Context.getSourceManager());
35615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    undefined.push_back(UndefinedInternal(decl, loc));
35715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  }
35815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
35915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  if (undefined.empty()) return;
36015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
36115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  // Sort (in order of use site) so that we're not (as) dependent on
36215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  // the iteration order through an llvm::DenseMap.
36315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  llvm::array_pod_sort(undefined.begin(), undefined.end());
36415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
3655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  for (SmallVectorImpl<UndefinedInternal>::iterator
36615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall         i = undefined.begin(), e = undefined.end(); i != e; ++i) {
36715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    NamedDecl *decl = i->decl;
36815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    S.Diag(decl->getLocation(), diag::warn_undefined_internal)
36915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall      << isa<VarDecl>(decl) << decl;
37015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    S.Diag(i->useLoc, diag::note_used_here);
37115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall  }
37215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall}
37315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
37431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregorvoid Sema::LoadExternalWeakUndeclaredIdentifiers() {
37531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  if (!ExternalSource)
37631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    return;
37731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
37831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  SmallVector<std::pair<IdentifierInfo *, WeakInfo>, 4> WeakIDs;
37931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs);
38031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  for (unsigned I = 0, N = WeakIDs.size(); I != N; ++I) {
38131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator Pos
38231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      = WeakUndeclaredIdentifiers.find(WeakIDs[I].first);
38331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    if (Pos != WeakUndeclaredIdentifiers.end())
38431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor      continue;
38531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
38631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor    WeakUndeclaredIdentifiers.insert(WeakIDs[I]);
38731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  }
38831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor}
38931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor
3909299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// ActOnEndOfTranslationUnit - This is called at the very end of the
3919299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// translation unit when EOF is reached and all but the top-level scope is
3929299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// popped.
3930e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisvoid Sema::ActOnEndOfTranslationUnit() {
394467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  // Only complete translation units define vtables and perform implicit
395467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  // instantiations.
396467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  if (TUKind == TU_Complete) {
397aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    // If any dynamic classes have their key function defined within
398aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    // this translation unit, then those vtables are considered "used" and must
399aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    // be emitted.
400a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor    for (DynamicClassesType::iterator I = DynamicClasses.begin(ExternalSource),
401a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor                                      E = DynamicClasses.end();
402a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor         I != E; ++I) {
403a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor      assert(!(*I)->isDependentType() &&
404a5c6c2a84cde5c9b8f8ec0610a9f89ffd54f44eeAnders Carlsson             "Should not see dependent types here!");
405a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor      if (const CXXMethodDecl *KeyFunction = Context.getKeyFunction(*I)) {
406aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth        const FunctionDecl *Definition = 0;
407aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth        if (KeyFunction->hasBody(Definition))
408a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor          MarkVTableUsed(Definition->getLocation(), *I, true);
409aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth      }
410aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth    }
411aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth
4128155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // If DefinedUsedVTables ends up marking any virtual member functions it
4138155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // might lead to more pending template instantiations, which we then need
4148155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // to instantiate.
4158155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    DefineUsedVTables();
4168155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky
4178155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // C++: Perform implicit template instantiations.
4188155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    //
4198155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // FIXME: When we perform these implicit instantiations, we do not
4208155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // carefully keep track of the point of instantiation (C++ [temp.point]).
4218155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // This means that name lookup that occurs within the template
4228155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // instantiation will always happen at the end of the translation unit,
4238155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // so it will find some names that should not be found. Although this is
4248155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // common behavior for C++ compilers, it is technically wrong. In the
4258155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // future, we either need to be able to filter the results of name lookup
4268155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    // or we need to perform template instantiations earlier.
4278155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky    PerformPendingInstantiations();
4282a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky  }
429d6a637f8c8a93863509fc1bc555513ff6504957dAnders Carlsson
43049b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis  // Remove file scoped decls that turned out to be used.
431a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor  UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(0,
432a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor                                                                         true),
433bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis                                             UnusedFileScopedDecls.end(),
434bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis                              std::bind1st(std::ptr_fun(ShouldRemoveFromUnused),
435bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis                                           this)),
43649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis                              UnusedFileScopedDecls.end());
43747268a3f2843a8d64f3a6fef1e9a9dde1feb4a8cDouglas Gregor
438467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  if (TUKind == TU_Prefix) {
439467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    // Translation unit prefixes don't need any of the checking below.
44087c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor    TUScope = 0;
44172b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis    return;
44287c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  }
44372b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis
44463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner  // Check for #pragma weak identifiers that were never declared
44563d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner  // FIXME: This will cause diagnostics to be emitted in a non-determinstic
44663d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner  // order!  Iterating over a densemap like this is bad.
44731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor  LoadExternalWeakUndeclaredIdentifiers();
448e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn  for (llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator
44963d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner       I = WeakUndeclaredIdentifiers.begin(),
45063d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner       E = WeakUndeclaredIdentifiers.end(); I != E; ++I) {
45163d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner    if (I->second.getUsed()) continue;
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45363d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner    Diag(I->second.getLocation(), diag::warn_weak_identifier_undeclared)
45463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      << I->first;
455e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn  }
456e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn
457467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  if (TUKind == TU_Module) {
458467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    // Modules don't need any of the checking below.
459467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    TUScope = 0;
460467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor    return;
461467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor  }
462467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor
463275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  // C99 6.9.2p2:
464275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   A declaration of an identifier for an object that has file
465275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   scope without an initializer, and without a storage-class
466275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   specifier or with the storage-class specifier static,
467275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   constitutes a tentative definition. If a translation unit
468275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   contains one or more tentative definitions for an identifier,
469275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   and the translation unit contains no external definition for
470275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   that identifier, then the behavior is exactly as if the
471275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   translation unit contains a file scope declaration of that
472275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   identifier, with the composite type as of the end of the
473275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  //   translation unit, with an initializer equal to 0.
474e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl  llvm::SmallSet<VarDecl *, 32> Seen;
475a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  for (TentativeDefinitionsType::iterator
476a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor            T = TentativeDefinitions.begin(ExternalSource),
477a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor         TEnd = TentativeDefinitions.end();
478a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor       T != TEnd; ++T)
479a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor  {
480a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor    VarDecl *VD = (*T)->getActingDefinition();
481e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl
482e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    // If the tentative definition was completed, getActingDefinition() returns
483e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    // null. If we've already seen this variable before, insert()'s second
484e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    // return value is false.
485e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl    if (VD == 0 || VD->isInvalidDecl() || !Seen.insert(VD))
486b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor      continue;
487b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor
4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const IncompleteArrayType *ArrayT
489b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor        = Context.getAsIncompleteArrayType(VD->getType())) {
4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (RequireCompleteType(VD->getLocation(),
491b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor                              ArrayT->getElementType(),
49263d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner                              diag::err_tentative_def_incomplete_type_arr)) {
493b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor        VD->setInvalidDecl();
49463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner        continue;
495275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor      }
4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      // Set the length of the array to 1 (C99 6.9.2p5).
49863d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);
49963d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true);
50046a617a792bfab0d9b1e057371ea3b9540802226John McCall      QualType T = Context.getConstantArrayType(ArrayT->getElementType(),
50146a617a792bfab0d9b1e057371ea3b9540802226John McCall                                                One, ArrayType::Normal, 0);
50263d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner      VD->setType(T);
5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else if (RequireCompleteType(VD->getLocation(), VD->getType(),
504b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor                                   diag::err_tentative_def_incomplete_type))
505b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor      VD->setInvalidDecl();
506b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor
507b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor    // Notify the consumer that we've completed a tentative definition.
508b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor    if (!VD->isInvalidDecl())
509b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor      Consumer.CompleteTentativeDefinition(VD);
510b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor
511275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  }
51243f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis
513c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt  if (LangOpts.CPlusPlus0x &&
514c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt      Diags.getDiagnosticLevel(diag::warn_delegating_ctor_cycle,
515c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt                               SourceLocation())
516c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt        != Diagnostic::Ignored)
517fe57eef44cc80e5bb51e4f484835be08b8d84256Sean Hunt    CheckDelegatingCtorCycles();
518fe57eef44cc80e5bb51e4f484835be08b8d84256Sean Hunt
51943f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis  // If there were errors, disable 'unused' warnings since they will mostly be
52043f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis  // noise.
52143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis  if (!Diags.hasErrorOccurred()) {
52243f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis    // Output warning for unused file scoped decls.
523a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor    for (UnusedFileScopedDeclsType::iterator
524a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor           I = UnusedFileScopedDecls.begin(ExternalSource),
52543f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis           E = UnusedFileScopedDecls.end(); I != E; ++I) {
526a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor      if (ShouldRemoveFromUnused(this, *I))
527a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor        continue;
528a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor
52943f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
53043f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        const FunctionDecl *DiagD;
53143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        if (!FD->hasBody(DiagD))
53243f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis          DiagD = FD;
53348b89590f61575cbf365ba996a2bd1ba1561a4abArgyrios Kyrtzidis        if (DiagD->isDeleted())
53448b89590f61575cbf365ba996a2bd1ba1561a4abArgyrios Kyrtzidis          continue; // Deleted functions are supposed to be unused.
5356b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        if (DiagD->isReferenced()) {
5366b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          if (isa<CXXMethodDecl>(DiagD))
5376b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis            Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
5386b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                  << DiagD->getDeclName();
5396b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          else
5406b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis            Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
5416b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                  << /*function*/0 << DiagD->getDeclName();
5426b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        } else {
5436b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          Diag(DiagD->getLocation(),
5446b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis               isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function
5456b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                                         : diag::warn_unused_function)
5466b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                << DiagD->getDeclName();
5476b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        }
54843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis      } else {
54943f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();
55043f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis        if (!DiagD)
55143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis          DiagD = cast<VarDecl>(*I);
5526b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        if (DiagD->isReferenced()) {
5536b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
5546b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                << /*variable*/1 << DiagD->getDeclName();
5556b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        } else {
5566b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis          Diag(DiagD->getLocation(), diag::warn_unused_variable)
5576b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis                << DiagD->getDeclName();
5586b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis        }
55943f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis      }
560bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    }
56115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall
56215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall    checkUndefinedInternals(*this);
56349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis  }
56487c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor
565483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  // Check we've noticed that we're no longer parsing the initializer for every
566483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  // variable. If we miss cases, then at best we have a performance issue and
567483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  // at worst a rejects-valid bug.
568483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith  assert(ParsingInitForAutoVars.empty() &&
569483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith         "Didn't unmark var as having its initializer parsed");
570483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith
57187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor  TUScope = 0;
5729299f3fa85796613cc787a2062c9562d07c8613eChris Lattner}
5739299f3fa85796613cc787a2062c9562d07c8613eChris Lattner
5749299f3fa85796613cc787a2062c9562d07c8613eChris Lattner
5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Helper functions.
5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5798517d9b731f065cdfc55ec0f3ddf5d564d988648Anders CarlssonDeclContext *Sema::getFunctionLevelDeclContext() {
580db0ee1da16e9dbec19b144c9cd96ee9f55fe0c53John McCall  DeclContext *DC = CurContext;
5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
582d9008318fe395dcbb9049cfb4f2b87cfb5a75f3aDouglas Gregor  while (isa<BlockDecl>(DC) || isa<EnumDecl>(DC))
5838517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson    DC = DC->getParent();
5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5858517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  return DC;
5868517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson}
5878517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson
588371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// getCurFunctionDecl - If inside of a function body, this returns a pointer
589371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// to the function decl for the function being parsed.  If we're currently
590371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// in a 'block', this returns the containing context.
591371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerFunctionDecl *Sema::getCurFunctionDecl() {
5928517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  DeclContext *DC = getFunctionLevelDeclContext();
593371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner  return dyn_cast<FunctionDecl>(DC);
594371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner}
595371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner
596c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel DunbarObjCMethodDecl *Sema::getCurMethodDecl() {
5978517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  DeclContext *DC = getFunctionLevelDeclContext();
598d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff  return dyn_cast<ObjCMethodDecl>(DC);
599c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar}
600371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner
601371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerNamedDecl *Sema::getCurFunctionOrMethodDecl() {
6028517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson  DeclContext *DC = getFunctionLevelDeclContext();
603371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner  if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
6044afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor    return cast<NamedDecl>(DC);
605371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner  return 0;
606371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner}
607371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner
60825a88bbf042317976f0d9cbfa87dfe89426e8393Douglas GregorSema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() {
6099b623639378d53a675921ddfa7316034d571881eDouglas Gregor  if (!isActive())
6109b623639378d53a675921ddfa7316034d571881eDouglas Gregor    return;
6119b623639378d53a675921ddfa7316034d571881eDouglas Gregor
6121eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor  if (llvm::Optional<TemplateDeductionInfo*> Info = SemaRef.isSFINAEContext()) {
61333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    switch (DiagnosticIDs::getDiagnosticSFINAEResponse(getDiagID())) {
61433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    case DiagnosticIDs::SFINAE_Report:
6159b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // Fall through; we'll report the diagnostic below.
6169b623639378d53a675921ddfa7316034d571881eDouglas Gregor      break;
6179b623639378d53a675921ddfa7316034d571881eDouglas Gregor
6181eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor    case DiagnosticIDs::SFINAE_AccessControl:
6197822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // Per C++ Core Issue 1170, access control is part of SFINAE.
6207822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // Additionally, the AccessCheckingSFINAE flag can be used to temporary
6217822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // make access control a part of SFINAE for the purposes of checking
6227822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      // type traits.
6237822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor      if (!SemaRef.AccessCheckingSFINAE &&
6247822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor          !SemaRef.getLangOptions().CPlusPlus0x)
6251eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor        break;
6261eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor
62733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    case DiagnosticIDs::SFINAE_SubstitutionFailure:
6289b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // Count this failure so that we know that template argument deduction
6299b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // has failed.
6309b623639378d53a675921ddfa7316034d571881eDouglas Gregor      ++SemaRef.NumSFINAEErrors;
6319b623639378d53a675921ddfa7316034d571881eDouglas Gregor      SemaRef.Diags.setLastDiagnosticIgnored();
6329b623639378d53a675921ddfa7316034d571881eDouglas Gregor      SemaRef.Diags.Clear();
6339b623639378d53a675921ddfa7316034d571881eDouglas Gregor      Clear();
6349b623639378d53a675921ddfa7316034d571881eDouglas Gregor      return;
6359b623639378d53a675921ddfa7316034d571881eDouglas Gregor
63633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    case DiagnosticIDs::SFINAE_Suppress:
6379b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // Make a copy of this suppressed diagnostic and store it with the
6389b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // template-deduction information;
639b535041ee33c5eff255832bc5541c8d52aae8254Douglas Gregor      FlushCounts();
6409b623639378d53a675921ddfa7316034d571881eDouglas Gregor      DiagnosticInfo DiagInfo(&SemaRef.Diags);
641b535041ee33c5eff255832bc5541c8d52aae8254Douglas Gregor
6421eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor      if (*Info)
6431eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor        (*Info)->addSuppressedDiagnostic(DiagInfo.getLocation(),
6449b623639378d53a675921ddfa7316034d571881eDouglas Gregor                        PartialDiagnostic(DiagInfo,
6459b623639378d53a675921ddfa7316034d571881eDouglas Gregor                                          SemaRef.Context.getDiagAllocator()));
6469b623639378d53a675921ddfa7316034d571881eDouglas Gregor
6479b623639378d53a675921ddfa7316034d571881eDouglas Gregor      // Suppress this diagnostic.
6489b623639378d53a675921ddfa7316034d571881eDouglas Gregor      SemaRef.Diags.setLastDiagnosticIgnored();
6499b623639378d53a675921ddfa7316034d571881eDouglas Gregor      SemaRef.Diags.Clear();
6509b623639378d53a675921ddfa7316034d571881eDouglas Gregor      Clear();
6519b623639378d53a675921ddfa7316034d571881eDouglas Gregor      return;
6529b623639378d53a675921ddfa7316034d571881eDouglas Gregor    }
6539b623639378d53a675921ddfa7316034d571881eDouglas Gregor  }
6549b623639378d53a675921ddfa7316034d571881eDouglas Gregor
6559b623639378d53a675921ddfa7316034d571881eDouglas Gregor  // Emit the diagnostic.
6565e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor  if (!this->Emit())
6575e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor    return;
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65925a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // If this is not a note, and we're in a template instantiation
66025a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // that is different from the last template instantiation where
66125a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // we emitted an error, print a template instantiation
66225a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  // backtrace.
66333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  if (!DiagnosticIDs::isBuiltinNote(DiagID) &&
66425a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor      !SemaRef.ActiveTemplateInstantiations.empty() &&
6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SemaRef.ActiveTemplateInstantiations.back()
66625a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor        != SemaRef.LastTemplateInstantiationErrorContext) {
66725a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor    SemaRef.PrintInstantiationStack();
6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.LastTemplateInstantiationErrorContext
66925a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor      = SemaRef.ActiveTemplateInstantiations.back();
67025a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor  }
67125a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor}
6722e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor
673eab5d1eaaa662c849f1f9920dc8c6a31d7c32d47Douglas GregorSema::SemaDiagnosticBuilder Sema::Diag(SourceLocation Loc, unsigned DiagID) {
67433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  DiagnosticBuilder DB = Diags.Report(Loc, DiagID);
675eab5d1eaaa662c849f1f9920dc8c6a31d7c32d47Douglas Gregor  return SemaDiagnosticBuilder(DB, *this, DiagID);
676eab5d1eaaa662c849f1f9920dc8c6a31d7c32d47Douglas Gregor}
677eab5d1eaaa662c849f1f9920dc8c6a31d7c32d47Douglas Gregor
67891a0cc913ecc5619b76d2e40742fd09725be8c56Anders CarlssonSema::SemaDiagnosticBuilder
67991a0cc913ecc5619b76d2e40742fd09725be8c56Anders CarlssonSema::Diag(SourceLocation Loc, const PartialDiagnostic& PD) {
68091a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  SemaDiagnosticBuilder Builder(Diag(Loc, PD.getDiagID()));
68191a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  PD.Emit(Builder);
6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68391a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson  return Builder;
68491a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson}
68591a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson
686108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// \brief Looks through the macro-expansion chain for the given
687108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// location, looking for a macro expansion with the given name.
688834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall/// If one is found, returns true and sets the location to that
689108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// expansion loc.
6905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) {
691834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  SourceLocation loc = locref;
692834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  if (!loc.isMacroID()) return false;
693834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall
694834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  // There's no good way right now to look at the intermediate
695108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth  // expansions, so just jump to the expansion location.
696402785357ab053dd53f4fdd858b9630a5e0f8badChandler Carruth  loc = getSourceManager().getExpansionLoc(loc);
697834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall
698834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  // If that's written with the name, stop here.
6995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<char, 16> buffer;
700834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  if (getPreprocessor().getSpelling(loc, buffer) == name) {
701834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall    locref = loc;
702834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall    return true;
703834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  }
704834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall  return false;
705834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall}
706834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall
70723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// \brief Determines the active Scope associated with the given declaration
70823c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// context.
70923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor///
71023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// This routine maps a declaration context to the active Scope object that
71123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// represents that declaration context in the parser. It is typically used
71223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// from "scope-less" code (e.g., template instantiation, lazy creation of
71323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// declarations) that injects a name for name-lookup purposes and, therefore,
71423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// must update the Scope.
71523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor///
71623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// \returns The scope corresponding to the given declaraion context, or NULL
71723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// if no such scope is open.
71823c94dbb6631fecdb55ba401aa93722803d980c6Douglas GregorScope *Sema::getScopeForContext(DeclContext *Ctx) {
71923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor
72023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  if (!Ctx)
72123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor    return 0;
72223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor
72323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  Ctx = Ctx->getPrimaryContext();
72423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  for (Scope *S = getCurScope(); S; S = S->getParent()) {
725cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl    // Ignore scopes that cannot have declarations. This is important for
726cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl    // out-of-line definitions of static class members.
727cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl    if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
728cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl      if (DeclContext *Entity = static_cast<DeclContext *> (S->getEntity()))
729cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl        if (Ctx == Entity->getPrimaryContext())
730cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl          return S;
73123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  }
73223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor
73323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor  return 0;
73423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor}
7359ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7369ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// \brief Enter a new function scope
7379ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregorvoid Sema::PushFunctionScope() {
738781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  if (FunctionScopes.size() == 1) {
739781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    // Use the "top" function scope rather than having to allocate
740781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    // memory for a new scope.
7418fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis    FunctionScopes.back()->Clear();
742781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    FunctionScopes.push_back(FunctionScopes.back());
7439ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor    return;
7449ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  }
7459ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7468fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  FunctionScopes.push_back(new FunctionScopeInfo(getDiagnostics()));
7479ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
7489ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7499ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregorvoid Sema::PushBlockScope(Scope *BlockScope, BlockDecl *Block) {
7508fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis  FunctionScopes.push_back(new BlockScopeInfo(getDiagnostics(),
7519ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor                                              BlockScope, Block));
7529ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
7539ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7543ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenekvoid Sema::PopFunctionOrBlockScope(const AnalysisBasedWarnings::Policy *WP,
7553ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek                                   const Decl *D, const BlockExpr *blkExpr) {
7563ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek  FunctionScopeInfo *Scope = FunctionScopes.pop_back_val();
757781472fe99a120098c631b0cbe33c89f8cef5e70John McCall  assert(!FunctionScopes.empty() && "mismatched push/pop!");
7583ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek
7593ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek  // Issue any analysis-based warnings.
7603ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek  if (WP && D)
761283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek    AnalysisWarnings.IssueWarnings(*WP, Scope, D, blkExpr);
762351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  else {
7635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    for (SmallVectorImpl<sema::PossiblyUnreachableDiag>::iterator
764351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek         i = Scope->PossiblyUnreachableDiags.begin(),
765351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek         e = Scope->PossiblyUnreachableDiags.end();
766351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek         i != e; ++i) {
767351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek      const sema::PossiblyUnreachableDiag &D = *i;
768351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek      Diag(D.Loc, D.PD);
769351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek    }
770351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  }
7713ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek
772351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  if (FunctionScopes.back() != Scope) {
773781472fe99a120098c631b0cbe33c89f8cef5e70John McCall    delete Scope;
774351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek  }
7759ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
7769ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7779ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// \brief Determine whether any errors occurred within this function/method/
7789ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// block.
779f85e193739c953358c865005855253af4f68a497John McCallbool Sema::hasAnyUnrecoverableErrorsInThisFunction() const {
780f85e193739c953358c865005855253af4f68a497John McCall  return getCurFunction()->ErrorTrap.hasUnrecoverableErrorOccurred();
7819ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
7829ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7839ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorBlockScopeInfo *Sema::getCurBlock() {
7849ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  if (FunctionScopes.empty())
7859ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor    return 0;
7869ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor
7879ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor  return dyn_cast<BlockScopeInfo>(FunctionScopes.back());
7889ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor}
78976bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall
79076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall// Pin this vtable to this file.
79176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCallExternalSemaSource::~ExternalSemaSource() {}
792f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
7938c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redlstd::pair<ObjCMethodList, ObjCMethodList>
7948c84571f3e262569ba51d107db7ab31a23de79b3Sebastian RedlExternalSemaSource::ReadMethodPool(Selector Sel) {
7958c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl  return std::pair<ObjCMethodList, ObjCMethodList>();
7968c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl}
7978c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl
798d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregorvoid ExternalSemaSource::ReadKnownNamespaces(
7995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                           SmallVectorImpl<NamespaceDecl *> &Namespaces) {
800d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor}
801d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor
8025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid PrettyDeclStackTraceEntry::print(raw_ostream &OS) const {
803f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  SourceLocation Loc = this->Loc;
804f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation();
805f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  if (Loc.isValid()) {
806f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Loc.print(OS, S.getSourceManager());
807f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    OS << ": ";
808f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  }
809f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  OS << Message;
810f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
811f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  if (TheDecl && isa<NamedDecl>(TheDecl)) {
812f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    std::string Name = cast<NamedDecl>(TheDecl)->getNameAsString();
813f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    if (!Name.empty())
814f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      OS << " '" << Name << '\'';
815f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  }
816f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
817f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  OS << '\n';
818f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall}
819c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
820c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \brief Figure out if an expression could be turned into a call.
821c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
822c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// Use this when trying to recover from an error where the programmer may have
823c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// written just the name of a function instead of actually calling it.
824c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
825c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param E - The expression to examine.
826c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param ZeroArgCallReturnTy - If the expression can be turned into a call
827c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  with no arguments, this parameter is set to the type returned by such a
828c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  call; otherwise, it is set to an empty QualType.
829c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param NonTemplateOverloads - If the expression is an overloaded function
830c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  name, this parameter is populated with the decls of the various overloads.
831c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gaybool Sema::isExprCallable(const Expr &E, QualType &ZeroArgCallReturnTy,
832c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay                          UnresolvedSetImpl &NonTemplateOverloads) {
833c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  ZeroArgCallReturnTy = QualType();
834c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  NonTemplateOverloads.clear();
835c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (const OverloadExpr *Overloads = dyn_cast<OverloadExpr>(&E)) {
836c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    for (OverloadExpr::decls_iterator it = Overloads->decls_begin(),
837c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay         DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) {
838c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      // Our overload set may include TemplateDecls, which we'll ignore for our
839c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      // present purpose.
840c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      if (const FunctionDecl *OverloadDecl = dyn_cast<FunctionDecl>(*it)) {
841c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        NonTemplateOverloads.addDecl(*it);
842c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        if (OverloadDecl->getMinRequiredArguments() == 0)
843c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay          ZeroArgCallReturnTy = OverloadDecl->getResultType();
844c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      }
845c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    }
846c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    return true;
847c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
848c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
849c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (const DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(&E)) {
850c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (const FunctionDecl *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
851c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      if (Fun->getMinRequiredArguments() == 0)
852c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        ZeroArgCallReturnTy = Fun->getResultType();
853c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      return true;
854c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    }
855c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
856c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
857c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  // We don't have an expression that's convenient to get a FunctionDecl from,
858c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  // but we can at least check if the type is "function of 0 arguments".
859c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  QualType ExprTy = E.getType();
860c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  const FunctionType *FunTy = NULL;
8619389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay  QualType PointeeTy = ExprTy->getPointeeType();
8629389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay  if (!PointeeTy.isNull())
8639389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay    FunTy = PointeeTy->getAs<FunctionType>();
864c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (!FunTy)
865c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    FunTy = ExprTy->getAs<FunctionType>();
866c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (!FunTy && ExprTy == Context.BoundMemberTy) {
867c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // Look for the bound-member type.  If it's still overloaded, give up,
868c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // although we probably should have fallen into the OverloadExpr case above
869c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // if we actually have an overloaded bound member.
870c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    QualType BoundMemberTy = Expr::findBoundMemberType(&E);
871c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (!BoundMemberTy.isNull())
872c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      FunTy = BoundMemberTy->castAs<FunctionType>();
873c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
874c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
875c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (const FunctionProtoType *FPT =
876c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      dyn_cast_or_null<FunctionProtoType>(FunTy)) {
877c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (FPT->getNumArgs() == 0)
878c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      ZeroArgCallReturnTy = FunTy->getResultType();
879c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    return true;
880c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
881c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  return false;
882c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay}
883c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay
884c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \brief Give notes for a set of overloads.
885c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
886c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// A companion to isExprCallable. In cases when the name that the programmer
887c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// wrote was an overloaded function, we may be able to make some guesses about
888c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// plausible overloads based on their return types; such guesses can be handed
889c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// off to this method to be emitted as notes.
890c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///
891c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param Overloads - The overloads to note.
892c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param FinalNoteLoc - If we've suppressed printing some overloads due to
893c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  -fshow-overloads=best, this is the location to attach to the note about too
894c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  many candidates. Typically this will be the location of the original
895c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay///  ill-formed expression.
896c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gayvoid Sema::NoteOverloads(const UnresolvedSetImpl &Overloads,
897c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay                         const SourceLocation FinalNoteLoc) {
898c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  int ShownOverloads = 0;
899c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  int SuppressedOverloads = 0;
900c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  for (UnresolvedSetImpl::iterator It = Overloads.begin(),
901c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay       DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) {
902c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // FIXME: Magic number for max shown overloads stolen from
903c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    // OverloadCandidateSet::NoteCandidates.
904c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    if (ShownOverloads >= 4 &&
905c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        Diags.getShowOverloads() == Diagnostic::Ovl_Best) {
906c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      ++SuppressedOverloads;
907c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay      continue;
908c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    }
909c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    Diag(cast<FunctionDecl>(*It)->getSourceRange().getBegin(),
910c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay         diag::note_member_ref_possible_intended_overload);
911c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    ++ShownOverloads;
912c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  }
913c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay  if (SuppressedOverloads)
914c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay    Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
915c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay        << SuppressedOverloads;
916c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay}
917