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