15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the actions class which performs semantic analysis and 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// builds an AST out of a parse stream. 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 159c3087b0b0bea2fd782205c1274ebfc4290265e0John McCall#include "clang/Sema/SemaInternal.h" 169c3087b0b0bea2fd782205c1274ebfc4290265e0John McCall#include "clang/Sema/DelayedDiagnostic.h" 1782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov#include "TargetAttributesSema.h" 18e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn#include "llvm/ADT/DenseMap.h" 19e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl#include "llvm/ADT/SmallSet.h" 20680523a91dd3351389667c8de17121ba7ae82673John McCall#include "llvm/ADT/APFloat.h" 219257664568bf375b7790131a84d9a4fa30a5b7e3John McCall#include "llvm/Support/CrashRecoveryContext.h" 225f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/CXXFieldCollector.h" 239b623639378d53a675921ddfa7316034d571881eDouglas Gregor#include "clang/Sema/TemplateDeduction.h" 2476bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall#include "clang/Sema/ExternalSemaSource.h" 258c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl#include "clang/Sema/ObjCMethodList.h" 26f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "clang/Sema/PrettyDeclStackTrace.h" 275f1e0942a32657b625702aa52f82430d0120f424John McCall#include "clang/Sema/Scope.h" 28781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h" 2946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor#include "clang/Sema/SemaConsumer.h" 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 3179a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor#include "clang/AST/ASTDiagnostic.h" 32384aff8b94bb0d1ad6c5667b90621e5699815bb2John McCall#include "clang/AST/DeclCXX.h" 33f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper#include "clang/AST/DeclFriend.h" 34c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/DeclObjC.h" 35e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 36c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay#include "clang/AST/ExprCXX.h" 37ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner#include "clang/AST/StmtCXX.h" 3890db26000aefe9335370013eec64c85232d80227Douglas Gregor#include "clang/Lex/HeaderSearch.h" 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h" 40f7572a64a1e5f6f700527583ec5206a58ce6d9b6Douglas Gregor#include "clang/Basic/FileManager.h" 4191a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson#include "clang/Basic/PartialDiagnostic.h" 424d150c84514dbf15975960a3ea46bdf6b7f16a5bChris Lattner#include "clang/Basic/TargetInfo.h" 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 44781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema; 459ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 469ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorFunctionScopeInfo::~FunctionScopeInfo() { } 479ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 488fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidisvoid FunctionScopeInfo::Clear() { 49b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall HasBranchProtectedScope = false; 50b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall HasBranchIntoScope = false; 51b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall HasIndirectGoto = false; 52b60a77e453d32db0ab1914d28e175c2defc0eb65John McCall 539ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor SwitchStack.clear(); 545077c3876beeaed32280af88244e8050078619a8Douglas Gregor Returns.clear(); 558fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis ErrorTrap.reset(); 56351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek PossiblyUnreachableDiags.clear(); 579ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor} 589ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 599ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorBlockScopeInfo::~BlockScopeInfo() { } 60ec9ea7200718478e8a976529defbe21942a11c9cEli FriedmanLambdaScopeInfo::~LambdaScopeInfo() { } 619ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 62ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios KyrtzidisPrintingPolicy Sema::getPrintingPolicy(const ASTContext &Context, 63ea8c59aaa6bd19976879142296f8fd12f8926738Argyrios Kyrtzidis const Preprocessor &PP) { 648987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor PrintingPolicy Policy = Context.getPrintingPolicy(); 654e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie Policy.Bool = Context.getLangOpts().Bool; 668987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor if (!Policy.Bool) { 678987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor if (MacroInfo *BoolMacro = PP.getMacroInfo(&Context.Idents.get("bool"))) { 688987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor Policy.Bool = BoolMacro->isObjectLike() && 698987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor BoolMacro->getNumTokens() == 1 && 708987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor BoolMacro->getReplacementToken(0).is(tok::kw__Bool); 718987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor } 728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor } 738987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 748987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor return Policy; 758987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor} 768987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 77c1a3e5e73859ece9f106ae9d84c78bef4111956aDouglas Gregorvoid Sema::ActOnTranslationUnitScope(Scope *S) { 788ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff TUScope = S; 7944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor PushDeclContext(S, Context.getTranslationUnitDecl()); 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 81c7e04dad588a30c94648b9bd70cdbe25688d7629John McCall VAListTagName = PP.getIdentifierInfo("__va_list_tag"); 82b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 833b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff 84f807fe0d1a865f4c6ba7e494cf4ae360c4173521Douglas GregorSema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, 85467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TranslationUnitKind TUKind, 863a2838d14251427089c39caec90c8abbc27f7a14Daniel Dunbar CodeCompleteConsumer *CodeCompleter) 874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie : TheTargetAttributesSema(0), FPFeatures(pp.getLangOpts()), 884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie LangOpts(pp.getLangOpts()), PP(pp), Context(ctxt), Consumer(consumer), 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()), 905d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth CollectStats(false), ExternalSource(0), CodeCompleter(CodeCompleter), 913a387441ae339363ee5b254658f295e97bd9e913Argyrios Kyrtzidis CurContext(0), OriginalLexicalContext(0), 923a387441ae339363ee5b254658f295e97bd9e913Argyrios Kyrtzidis PackContext(0), MSStructPragmaOn(false), VisContext(0), 9380ee6e878a169e6255d4686a91bb696151ff229fJohn McCall ExprNeedsCleanups(false), LateTemplateParser(0), OpaqueParser(0), 94395e04dbd7294bae4640aef1705cec3d052578b0Sebastian Redl IdResolver(pp), StdInitializerList(0), CXXTypeInfoDecl(0), MSVCGuidDecl(0), 95471131a05d4f9dca7f9f4f5109f2a9a4ce80bf65Benjamin Kramer NSNumberDecl(0), 96471131a05d4f9dca7f9f4f5109f2a9a4ce80bf65Benjamin Kramer NSStringDecl(0), StringWithUTF8StringMethod(0), 97471131a05d4f9dca7f9f4f5109f2a9a4ce80bf65Benjamin Kramer NSArrayDecl(0), ArrayWithObjectsMethod(0), 98ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek NSDictionaryDecl(0), DictionaryWithObjectsMethod(0), 99b7566d8346ed8040a5cb7cefe96bd6ccbf015595Bill Wendling GlobalNewDeleteDeclared(false), 100467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TUKind(TUKind), 10113489673b84fafaaf49cf5ae4e3bb9a945524dcbJohn McCall NumSFINAEErrors(0), InFunctionDeclarator(0), 1021eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false), 1038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1), 1048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor CurrentInstantiationScope(0), TyposCorrected(0), 105b7566d8346ed8040a5cb7cefe96bd6ccbf015595Bill Wendling AnalysisWarnings(*this) 106f35f828f9883123772a9731af190a608f3236ef4Douglas Gregor{ 1073b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff TUScope = 0; 108cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor 109d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor LoadedExternalKnownNamespaces = false; 110ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek for (unsigned I = 0; I != NSAPI::NumNSNumberLiteralMethods; ++I) 111ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek NSNumberLiteralMethods[I] = 0; 112ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1134e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjC1) 114ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek NSAPIObj.reset(new NSAPI(Context)); 115ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1164e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().CPlusPlus) 11707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis FieldCollector.reset(new CXXFieldCollector()); 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11922caddc91d2f6186739c6b20ec58ed38cd68e595Chris Lattner // Tell diagnostics how to render things from the AST library. 12079a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor PP.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument, 12179a9a3417929e340e84dcbc06ed9c3a277cad959Douglas Gregor &Context); 1222afce7248b7a362f1e322ad18e43484d575b9c9dDouglas Gregor 1232afce7248b7a362f1e322ad18e43484d575b9c9dDouglas Gregor ExprEvalContexts.push_back( 12476f3f69db1416425070177243e9f390122c553e0Richard Smith ExpressionEvaluationContextRecord(PotentiallyEvaluated, 0, 12576f3f69db1416425070177243e9f390122c553e0Richard Smith false, 0, false)); 126781472fe99a120098c631b0cbe33c89f8cef5e70John McCall 1278fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis FunctionScopes.push_back(new FunctionScopeInfo(Diags)); 12846ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor} 12946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor 13046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregorvoid Sema::Initialize() { 13146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor // Tell the AST consumer about this Sema object. 13246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor Consumer.Initialize(Context); 13346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor 13446ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor // FIXME: Isn't this redundant with the initialization above? 13546ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer)) 13646ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor SC->InitializeSema(*this); 13746ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor 13846ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor // Tell the external Sema source about this Sema object. 13946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor if (ExternalSemaSource *ExternalSema 14046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource())) 14146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor ExternalSema->InitializeSema(*this); 1424dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor 143772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor // Initialize predefined 128-bit integer types, if needed. 144772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor if (PP.getTargetInfo().getPointerWidth(0) >= 64) { 145772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor // If either of the 128-bit integer types are unavailable to name lookup, 146772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor // define them now. 147772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor DeclarationName Int128 = &Context.Idents.get("__int128_t"); 148eee242ff426bf79149f221798966e58688383c1eDouglas Gregor if (IdResolver.begin(Int128) == IdResolver.end()) 149772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor PushOnScopeChains(Context.getInt128Decl(), TUScope); 150772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 151772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor DeclarationName UInt128 = &Context.Idents.get("__uint128_t"); 152eee242ff426bf79149f221798966e58688383c1eDouglas Gregor if (IdResolver.begin(UInt128) == IdResolver.end()) 153772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor PushOnScopeChains(Context.getUInt128Decl(), TUScope); 154772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor } 155772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 156772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor 1574dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor // Initialize predefined Objective-C types: 1584e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (PP.getLangOpts().ObjC1) { 1597a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor // If 'SEL' does not yet refer to any declarations, make it refer to the 1607a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor // predefined 'SEL'. 1617a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor DeclarationName SEL = &Context.Idents.get("SEL"); 162eee242ff426bf79149f221798966e58688383c1eDouglas Gregor if (IdResolver.begin(SEL) == IdResolver.end()) 1637a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor PushOnScopeChains(Context.getObjCSelDecl(), TUScope); 1647a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor 1654dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor // If 'id' does not yet refer to any declarations, make it refer to the 1664dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor // predefined 'id'. 1674dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor DeclarationName Id = &Context.Idents.get("id"); 168eee242ff426bf79149f221798966e58688383c1eDouglas Gregor if (IdResolver.begin(Id) == IdResolver.end()) 1694dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor PushOnScopeChains(Context.getObjCIdDecl(), TUScope); 17079d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor 17179d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor // Create the built-in typedef for 'Class'. 17279d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor DeclarationName Class = &Context.Idents.get("Class"); 173eee242ff426bf79149f221798966e58688383c1eDouglas Gregor if (IdResolver.begin(Class) == IdResolver.end()) 17479d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor PushOnScopeChains(Context.getObjCClassDecl(), TUScope); 175a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor 176a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor // Create the built-in forward declaratino for 'Protocol'. 177a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor DeclarationName Protocol = &Context.Idents.get("Protocol"); 178a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor if (IdResolver.begin(Protocol) == IdResolver.end()) 179a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor PushOnScopeChains(Context.getObjCProtocolDecl(), TUScope); 1804dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor } 181c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge 182c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge DeclarationName BuiltinVaList = &Context.Idents.get("__builtin_va_list"); 183c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge if (IdResolver.begin(BuiltinVaList) == IdResolver.end()) 184c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge PushOnScopeChains(Context.getBuiltinVaListDecl(), TUScope); 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 18782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovSema::~Sema() { 18882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (PackContext) FreePackedContext(); 189aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman if (VisContext) FreeVisContext(); 19082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov delete TheTargetAttributesSema; 19162c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian MSStructPragmaOn = false; 192781472fe99a120098c631b0cbe33c89f8cef5e70John McCall // Kill all the active scopes. 193781472fe99a120098c631b0cbe33c89f8cef5e70John McCall for (unsigned I = 1, E = FunctionScopes.size(); I != E; ++I) 194781472fe99a120098c631b0cbe33c89f8cef5e70John McCall delete FunctionScopes[I]; 195781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (FunctionScopes.size() == 1) 196781472fe99a120098c631b0cbe33c89f8cef5e70John McCall delete FunctionScopes[0]; 19746ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor 19846ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor // Tell the SemaConsumer to forget about us; we're going out of scope. 19946ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer)) 20046ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor SC->ForgetSema(); 20146ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor 20246ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor // Detach from the external Sema source. 20346ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor if (ExternalSemaSource *ExternalSema 204914ed9d30e9abf829a62aa996b083b1e47c19ff6Douglas Gregor = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource())) 20546ea32a4b54481b7575499cb9f8d275f1d4cdd54Douglas Gregor ExternalSema->ForgetSema(); 20682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 20782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 208f85e193739c953358c865005855253af4f68a497John McCall/// makeUnavailableInSystemHeader - There is an error in the current 209f85e193739c953358c865005855253af4f68a497John McCall/// context. If we're still in a system header, and we can plausibly 210f85e193739c953358c865005855253af4f68a497John McCall/// make the relevant declaration unavailable instead of erroring, do 211f85e193739c953358c865005855253af4f68a497John McCall/// so and return true. 212f85e193739c953358c865005855253af4f68a497John McCallbool Sema::makeUnavailableInSystemHeader(SourceLocation loc, 2135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef msg) { 214f85e193739c953358c865005855253af4f68a497John McCall // If we're not in a function, it's an error. 215f85e193739c953358c865005855253af4f68a497John McCall FunctionDecl *fn = dyn_cast<FunctionDecl>(CurContext); 216f85e193739c953358c865005855253af4f68a497John McCall if (!fn) return false; 217f85e193739c953358c865005855253af4f68a497John McCall 218f85e193739c953358c865005855253af4f68a497John McCall // If we're in template instantiation, it's an error. 219f85e193739c953358c865005855253af4f68a497John McCall if (!ActiveTemplateInstantiations.empty()) 220f85e193739c953358c865005855253af4f68a497John McCall return false; 221f85e193739c953358c865005855253af4f68a497John McCall 222f85e193739c953358c865005855253af4f68a497John McCall // If that function's not in a system header, it's an error. 223f85e193739c953358c865005855253af4f68a497John McCall if (!Context.getSourceManager().isInSystemHeader(loc)) 224f85e193739c953358c865005855253af4f68a497John McCall return false; 225f85e193739c953358c865005855253af4f68a497John McCall 226f85e193739c953358c865005855253af4f68a497John McCall // If the function is already unavailable, it's not an error. 227f85e193739c953358c865005855253af4f68a497John McCall if (fn->hasAttr<UnavailableAttr>()) return true; 228f85e193739c953358c865005855253af4f68a497John McCall 229f85e193739c953358c865005855253af4f68a497John McCall fn->addAttr(new (Context) UnavailableAttr(loc, Context, msg)); 230f85e193739c953358c865005855253af4f68a497John McCall return true; 231f85e193739c953358c865005855253af4f68a497John McCall} 232f85e193739c953358c865005855253af4f68a497John McCall 23358a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian RedlASTMutationListener *Sema::getASTMutationListener() const { 23458a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl return getASTConsumer().GetASTMutationListener(); 23558a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl} 23658a2cd8c0d52e710cbcc57a67eac7b51b0b831c4Sebastian Redl 2375d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth/// \brief Print out statistics about the semantic analysis. 2385d98994c7749312a43ce6adf45537979a98e7afdChandler Carruthvoid Sema::PrintStats() const { 2395d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth llvm::errs() << "\n*** Semantic Analysis Stats:\n"; 2405d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth llvm::errs() << NumSFINAEErrors << " SFINAE diagnostics trapped.\n"; 2415d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth 2425d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth BumpAlloc.PrintStats(); 2435d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth AnalysisWarnings.PrintStats(); 2445d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth} 2455d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth 246c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast. 247c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith/// If there is already an implicit cast, merge into the existing one. 248c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith/// The result is of the given category. 249c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard SmithExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty, 250c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith CastKind Kind, ExprValueKind VK, 251c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith const CXXCastPath *BasePath, 252c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith CheckedConversionKind CCK) { 2539c129f818038e0269ba6b095722aa70176dc321dRichard Smith#ifndef NDEBUG 2549c129f818038e0269ba6b095722aa70176dc321dRichard Smith if (VK == VK_RValue && !E->isRValue()) { 2559c129f818038e0269ba6b095722aa70176dc321dRichard Smith switch (Kind) { 2569c129f818038e0269ba6b095722aa70176dc321dRichard Smith default: 2579c129f818038e0269ba6b095722aa70176dc321dRichard Smith assert(0 && "can't implicitly cast lvalue to rvalue with this cast kind"); 2589c129f818038e0269ba6b095722aa70176dc321dRichard Smith case CK_LValueToRValue: 2599c129f818038e0269ba6b095722aa70176dc321dRichard Smith case CK_ArrayToPointerDecay: 2609c129f818038e0269ba6b095722aa70176dc321dRichard Smith case CK_FunctionToPointerDecay: 2619c129f818038e0269ba6b095722aa70176dc321dRichard Smith case CK_ToVoid: 2629c129f818038e0269ba6b095722aa70176dc321dRichard Smith break; 2639c129f818038e0269ba6b095722aa70176dc321dRichard Smith } 2649c129f818038e0269ba6b095722aa70176dc321dRichard Smith } 265acdfa4d504a8f2514d60569f9ce55d45f11795b9Richard Smith assert((VK == VK_RValue || !E->isRValue()) && "can't cast rvalue to lvalue"); 2669c129f818038e0269ba6b095722aa70176dc321dRichard Smith#endif 2679c129f818038e0269ba6b095722aa70176dc321dRichard Smith 268429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType ExprTy = Context.getCanonicalType(E->getType()); 2693a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang QualType TypeTy = Context.getCanonicalType(Ty); 2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2713a2c7449e356ed74552450bc1dd50691c8202770Mon P Wang if (ExprTy == TypeTy) 272429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley return Owned(E); 2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2744e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (getLangOpts().ObjCAutoRefCount) 275f85e193739c953358c865005855253af4f68a497John McCall CheckObjCARCConversion(SourceRange(), Ty, E, CCK); 276f85e193739c953358c865005855253af4f68a497John McCall 2776fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor // If this is a derived-to-base cast to a through a virtual base, we 2786fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor // need a vtable. 2792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall if (Kind == CK_DerivedToBase && 280f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall BasePathInvolvesVirtualBase(*BasePath)) { 281429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley QualType T = E->getType(); 2826fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const PointerType *Pointer = T->getAs<PointerType>()) 2836fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor T = Pointer->getPointeeType(); 2846fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor if (const RecordType *RecordTy = T->getAs<RecordType>()) 285429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley MarkVTableUsed(E->getLocStart(), 2866fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor cast<CXXRecordDecl>(RecordTy->getDecl())); 2876fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor } 288c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith 289c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) { 290c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) { 291c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith ImpCast->setType(Ty); 292c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith ImpCast->setValueKind(VK); 293c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith return Owned(E); 294c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith } 2954c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson } 2964c5fad3f73957420b0410f7370cbd63b09f32a1cAnders Carlsson 297c8d7f586180995ba33d03c0f6115b6a7bdefe326Richard Smith return Owned(ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath, VK)); 298906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl} 299906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl 300737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara/// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding 301737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara/// to the conversion from scalar type ScalarTy to the Boolean type. 302737d5447b5d20633992ee5388eca5270c28c8ae7Abramo BagnaraCastKind Sema::ScalarTypeToBooleanCastKind(QualType ScalarTy) { 303737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara switch (ScalarTy->getScalarTypeKind()) { 304737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara case Type::STK_Bool: return CK_NoOp; 3051d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case Type::STK_CPointer: return CK_PointerToBoolean; 3061d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case Type::STK_BlockPointer: return CK_PointerToBoolean; 3071d9b3b25f7ac0d0195bba6b507a684fe5e7943eeJohn McCall case Type::STK_ObjCObjectPointer: return CK_PointerToBoolean; 308737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara case Type::STK_MemberPointer: return CK_MemberPointerToBoolean; 309737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara case Type::STK_Integral: return CK_IntegralToBoolean; 310737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara case Type::STK_Floating: return CK_FloatingToBoolean; 311737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara case Type::STK_IntegralComplex: return CK_IntegralComplexToBoolean; 312737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara case Type::STK_FloatingComplex: return CK_FloatingComplexToBoolean; 313737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara } 314737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara return CK_Invalid; 315737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara} 316737d5447b5d20633992ee5388eca5270c28c8ae7Abramo Bagnara 317bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis/// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector. 318bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) { 319bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (D->isUsed()) 320bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis return true; 321bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 322bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 323bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // UnusedFileScopedDecls stores the first declaration. 324bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // The declaration may have become definition so check again. 325bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis const FunctionDecl *DeclToCheck; 326bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (FD->hasBody(DeclToCheck)) 327bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck); 328bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 329bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // Later redecls may add new information resulting in not having to warn, 330bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // so check again. 331ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor DeclToCheck = FD->getMostRecentDecl(); 332bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (DeclToCheck != FD) 333bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck); 334bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis } 335bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 336bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 337bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // UnusedFileScopedDecls stores the first declaration. 338bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // The declaration may have become definition so check again. 339bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis const VarDecl *DeclToCheck = VD->getDefinition(); 340bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (DeclToCheck) 341bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck); 342bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 343bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // Later redecls may add new information resulting in not having to warn, 344bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis // so check again. 345ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor DeclToCheck = VD->getMostRecentDecl(); 346bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis if (DeclToCheck != VD) 347bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck); 348bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis } 349bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 350bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis return false; 351bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis} 352bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 35315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCallnamespace { 35415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall struct UndefinedInternal { 35515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall NamedDecl *decl; 35615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall FullSourceLoc useLoc; 35715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 35815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall UndefinedInternal(NamedDecl *decl, FullSourceLoc useLoc) 35915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall : decl(decl), useLoc(useLoc) {} 36015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall }; 36115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 36215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall bool operator<(const UndefinedInternal &l, const UndefinedInternal &r) { 36315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall return l.useLoc.isBeforeInTranslationUnitThan(r.useLoc); 36415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall } 36515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall} 36615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 36715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall/// checkUndefinedInternals - Check for undefined objects with internal linkage. 36815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCallstatic void checkUndefinedInternals(Sema &S) { 36915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (S.UndefinedInternals.empty()) return; 37015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 37115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall // Collect all the still-undefined entities with internal linkage. 3725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UndefinedInternal, 16> undefined; 37315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall for (llvm::DenseMap<NamedDecl*,SourceLocation>::iterator 37415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall i = S.UndefinedInternals.begin(), e = S.UndefinedInternals.end(); 37515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall i != e; ++i) { 37615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall NamedDecl *decl = i->first; 37715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 37815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall // Ignore attributes that have become invalid. 37915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (decl->isInvalidDecl()) continue; 38015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 38115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall // __attribute__((weakref)) is basically a definition. 38215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (decl->hasAttr<WeakRefAttr>()) continue; 38315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 38415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (FunctionDecl *fn = dyn_cast<FunctionDecl>(decl)) { 38515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (fn->isPure() || fn->hasBody()) 38615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall continue; 38715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall } else { 38815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (cast<VarDecl>(decl)->hasDefinition() != VarDecl::DeclarationOnly) 38915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall continue; 39015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall } 39115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 39215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall // We build a FullSourceLoc so that we can sort with array_pod_sort. 39315e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall FullSourceLoc loc(i->second, S.Context.getSourceManager()); 39415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall undefined.push_back(UndefinedInternal(decl, loc)); 39515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall } 39615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 39715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall if (undefined.empty()) return; 39815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 39915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall // Sort (in order of use site) so that we're not (as) dependent on 40015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall // the iteration order through an llvm::DenseMap. 40115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall llvm::array_pod_sort(undefined.begin(), undefined.end()); 40215e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 4035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<UndefinedInternal>::iterator 40415e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall i = undefined.begin(), e = undefined.end(); i != e; ++i) { 40515e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall NamedDecl *decl = i->decl; 40615e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall S.Diag(decl->getLocation(), diag::warn_undefined_internal) 40715e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall << isa<VarDecl>(decl) << decl; 40815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall S.Diag(i->useLoc, diag::note_used_here); 40915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall } 41015e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall} 41115e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 41231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregorvoid Sema::LoadExternalWeakUndeclaredIdentifiers() { 41331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor if (!ExternalSource) 41431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor return; 41531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor 41631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor SmallVector<std::pair<IdentifierInfo *, WeakInfo>, 4> WeakIDs; 41731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs); 41831e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor for (unsigned I = 0, N = WeakIDs.size(); I != N; ++I) { 41931e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator Pos 42031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor = WeakUndeclaredIdentifiers.find(WeakIDs[I].first); 42131e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor if (Pos != WeakUndeclaredIdentifiers.end()) 42231e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor continue; 42331e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor 42431e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor WeakUndeclaredIdentifiers.insert(WeakIDs[I]); 42531e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor } 42631e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor} 42731e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor 428f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper 429f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jaspertypedef llvm::DenseMap<const CXXRecordDecl*, bool> RecordCompleteMap; 430f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper 431f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// \brief Returns true, if all methods and nested classes of the given 432f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// CXXRecordDecl are defined in this translation unit. 433f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// 434f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// Should only be called from ActOnEndOfTranslationUnit so that all 435f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// definitions are actually read. 436f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasperstatic bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD, 437f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap &MNCComplete) { 438f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap::iterator Cache = MNCComplete.find(RD); 439f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (Cache != MNCComplete.end()) 440f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper return Cache->second; 441f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (!RD->isCompleteDefinition()) 442f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper return false; 443f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper bool Complete = true; 444f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper for (DeclContext::decl_iterator I = RD->decls_begin(), 445f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper E = RD->decls_end(); 446f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper I != E && Complete; ++I) { 447f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (const CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I)) 448f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = M->isDefined() || (M->isPure() && !isa<CXXDestructorDecl>(M)); 4490e9e9f8d17e38b3c44f6e1323be3a812a793bdd1Daniel Jasper else if (const FunctionTemplateDecl *F = dyn_cast<FunctionTemplateDecl>(*I)) 4500e9e9f8d17e38b3c44f6e1323be3a812a793bdd1Daniel Jasper Complete = F->getTemplatedDecl()->isDefined(); 451f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper else if (const CXXRecordDecl *R = dyn_cast<CXXRecordDecl>(*I)) { 452f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (R->isInjectedClassName()) 453f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper continue; 454f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (R->hasDefinition()) 455f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = MethodsAndNestedClassesComplete(R->getDefinition(), 456f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper MNCComplete); 457f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper else 458f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = false; 459f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 460f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 461f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper MNCComplete[RD] = Complete; 462f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper return Complete; 463f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper} 464f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper 465f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// \brief Returns true, if the given CXXRecordDecl is fully defined in this 466f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// translation unit, i.e. all methods are defined or pure virtual and all 467f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// friends, friend functions and nested classes are fully defined in this 468f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// translation unit. 469f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// 470f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// Should only be called from ActOnEndOfTranslationUnit so that all 471f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper/// definitions are actually read. 472f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasperstatic bool IsRecordFullyDefined(const CXXRecordDecl *RD, 473f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap &RecordsComplete, 474f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap &MNCComplete) { 475f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap::iterator Cache = RecordsComplete.find(RD); 476f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (Cache != RecordsComplete.end()) 477f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper return Cache->second; 478f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper bool Complete = MethodsAndNestedClassesComplete(RD, MNCComplete); 479f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper for (CXXRecordDecl::friend_iterator I = RD->friend_begin(), 480f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper E = RD->friend_end(); 481f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper I != E && Complete; ++I) { 482f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper // Check if friend classes and methods are complete. 483f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (TypeSourceInfo *TSI = (*I)->getFriendType()) { 484f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper // Friend classes are available as the TypeSourceInfo of the FriendDecl. 485f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl()) 486f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = MethodsAndNestedClassesComplete(FriendD, MNCComplete); 487f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper else 488f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = false; 489f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } else { 490f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper // Friend functions are available through the NamedDecl of FriendDecl. 491f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (const FunctionDecl *FD = 492f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper dyn_cast<FunctionDecl>((*I)->getFriendDecl())) 493f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = FD->isDefined(); 494f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper else 495f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper // This is a template friend, give up. 496f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Complete = false; 497f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 498f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 499f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordsComplete[RD] = Complete; 500f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper return Complete; 501f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper} 502f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper 5039299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// ActOnEndOfTranslationUnit - This is called at the very end of the 5049299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// translation unit when EOF is reached and all but the top-level scope is 5059299f3fa85796613cc787a2062c9562d07c8613eChris Lattner/// popped. 5060e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisvoid Sema::ActOnEndOfTranslationUnit() { 5079257664568bf375b7790131a84d9a4fa30a5b7e3John McCall assert(DelayedDiagnostics.getCurrentPool() == NULL 5089257664568bf375b7790131a84d9a4fa30a5b7e3John McCall && "reached end of translation unit with a pool attached?"); 5099257664568bf375b7790131a84d9a4fa30a5b7e3John McCall 510d82f5eb1f98825ad888fb0ab45e5d8ef2e0ec6a2Douglas Gregor // If code completion is enabled, don't perform any end-of-translation-unit 511d82f5eb1f98825ad888fb0ab45e5d8ef2e0ec6a2Douglas Gregor // work. 512d82f5eb1f98825ad888fb0ab45e5d8ef2e0ec6a2Douglas Gregor if (PP.isCodeCompletionEnabled()) 513d82f5eb1f98825ad888fb0ab45e5d8ef2e0ec6a2Douglas Gregor return; 514d82f5eb1f98825ad888fb0ab45e5d8ef2e0ec6a2Douglas Gregor 515467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor // Only complete translation units define vtables and perform implicit 516467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor // instantiations. 517467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor if (TUKind == TU_Complete) { 518849639d8b548519cc5a00c0c9253f0c0d525060dArgyrios Kyrtzidis DiagnoseUseOfUnimplementedSelectors(); 519849639d8b548519cc5a00c0c9253f0c0d525060dArgyrios Kyrtzidis 520aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth // If any dynamic classes have their key function defined within 521aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth // this translation unit, then those vtables are considered "used" and must 522aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth // be emitted. 523a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor for (DynamicClassesType::iterator I = DynamicClasses.begin(ExternalSource), 524a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor E = DynamicClasses.end(); 525a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor I != E; ++I) { 526a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor assert(!(*I)->isDependentType() && 527a5c6c2a84cde5c9b8f8ec0610a9f89ffd54f44eeAnders Carlsson "Should not see dependent types here!"); 528a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor if (const CXXMethodDecl *KeyFunction = Context.getKeyFunction(*I)) { 529aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth const FunctionDecl *Definition = 0; 530aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth if (KeyFunction->hasBody(Definition)) 531a126f17ca83b985300c1f65cee647bea108db657Douglas Gregor MarkVTableUsed(Definition->getLocation(), *I, true); 532aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth } 533aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth } 534aee543a1a3d70de38cd2607fd2f3179551febc93Chandler Carruth 5358155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // If DefinedUsedVTables ends up marking any virtual member functions it 5368155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // might lead to more pending template instantiations, which we then need 5378155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // to instantiate. 5388155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky DefineUsedVTables(); 5398155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky 5408155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // C++: Perform implicit template instantiations. 5418155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // 5428155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // FIXME: When we perform these implicit instantiations, we do not 5438155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // carefully keep track of the point of instantiation (C++ [temp.point]). 5448155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // This means that name lookup that occurs within the template 5458155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // instantiation will always happen at the end of the translation unit, 5468155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // so it will find some names that should not be found. Although this is 5478155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // common behavior for C++ compilers, it is technically wrong. In the 5488155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // future, we either need to be able to filter the results of name lookup 5498155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // or we need to perform template instantiations earlier. 5508155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky PerformPendingInstantiations(); 5512a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky } 552d6a637f8c8a93863509fc1bc555513ff6504957dAnders Carlsson 55349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis // Remove file scoped decls that turned out to be used. 554a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(0, 555a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor true), 556bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis UnusedFileScopedDecls.end(), 557bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis std::bind1st(std::ptr_fun(ShouldRemoveFromUnused), 558bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis this)), 55949b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis UnusedFileScopedDecls.end()); 56047268a3f2843a8d64f3a6fef1e9a9dde1feb4a8cDouglas Gregor 561467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor if (TUKind == TU_Prefix) { 562467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor // Translation unit prefixes don't need any of the checking below. 56387c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor TUScope = 0; 56472b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis return; 56587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor } 56672b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis 56763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner // Check for #pragma weak identifiers that were never declared 56863d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner // FIXME: This will cause diagnostics to be emitted in a non-determinstic 56963d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner // order! Iterating over a densemap like this is bad. 57031e37b2d7b4815fdea6a35d49f33005562f0d494Douglas Gregor LoadExternalWeakUndeclaredIdentifiers(); 571e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn for (llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator 57263d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner I = WeakUndeclaredIdentifiers.begin(), 57363d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner E = WeakUndeclaredIdentifiers.end(); I != E; ++I) { 57463d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner if (I->second.getUsed()) continue; 5751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57663d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner Diag(I->second.getLocation(), diag::warn_weak_identifier_undeclared) 57763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner << I->first; 578e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn } 579e25ff83fb7eee9eeda89b6f2371bc33a37bf1028Ryan Flynn 580467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor if (TUKind == TU_Module) { 58190db26000aefe9335370013eec64c85232d80227Douglas Gregor // If we are building a module, resolve all of the exported declarations 58290db26000aefe9335370013eec64c85232d80227Douglas Gregor // now. 58390db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Module *CurrentModule = PP.getCurrentModule()) { 58490db26000aefe9335370013eec64c85232d80227Douglas Gregor ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 58590db26000aefe9335370013eec64c85232d80227Douglas Gregor 58690db26000aefe9335370013eec64c85232d80227Douglas Gregor llvm::SmallVector<Module *, 2> Stack; 58790db26000aefe9335370013eec64c85232d80227Douglas Gregor Stack.push_back(CurrentModule); 58890db26000aefe9335370013eec64c85232d80227Douglas Gregor while (!Stack.empty()) { 58990db26000aefe9335370013eec64c85232d80227Douglas Gregor Module *Mod = Stack.back(); 59090db26000aefe9335370013eec64c85232d80227Douglas Gregor Stack.pop_back(); 59190db26000aefe9335370013eec64c85232d80227Douglas Gregor 59290db26000aefe9335370013eec64c85232d80227Douglas Gregor // Resolve the exported declarations. 59390db26000aefe9335370013eec64c85232d80227Douglas Gregor // FIXME: Actually complain, once we figure out how to teach the 59490db26000aefe9335370013eec64c85232d80227Douglas Gregor // diagnostic client to deal with complains in the module map at this 59590db26000aefe9335370013eec64c85232d80227Douglas Gregor // point. 59690db26000aefe9335370013eec64c85232d80227Douglas Gregor ModMap.resolveExports(Mod, /*Complain=*/false); 59790db26000aefe9335370013eec64c85232d80227Douglas Gregor 59890db26000aefe9335370013eec64c85232d80227Douglas Gregor // Queue the submodules, so their exports will also be resolved. 599b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor for (Module::submodule_iterator Sub = Mod->submodule_begin(), 600b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor SubEnd = Mod->submodule_end(); 60190db26000aefe9335370013eec64c85232d80227Douglas Gregor Sub != SubEnd; ++Sub) { 602b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Stack.push_back(*Sub); 60390db26000aefe9335370013eec64c85232d80227Douglas Gregor } 60490db26000aefe9335370013eec64c85232d80227Douglas Gregor } 60590db26000aefe9335370013eec64c85232d80227Douglas Gregor } 60690db26000aefe9335370013eec64c85232d80227Douglas Gregor 607467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor // Modules don't need any of the checking below. 608467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor TUScope = 0; 609467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor return; 610467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor } 611467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor 612275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // C99 6.9.2p2: 613275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // A declaration of an identifier for an object that has file 614275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // scope without an initializer, and without a storage-class 615275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // specifier or with the storage-class specifier static, 616275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // constitutes a tentative definition. If a translation unit 617275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // contains one or more tentative definitions for an identifier, 618275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // and the translation unit contains no external definition for 619275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // that identifier, then the behavior is exactly as if the 620275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // translation unit contains a file scope declaration of that 621275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // identifier, with the composite type as of the end of the 622275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor // translation unit, with an initializer equal to 0. 623e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl llvm::SmallSet<VarDecl *, 32> Seen; 624a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor for (TentativeDefinitionsType::iterator 625a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor T = TentativeDefinitions.begin(ExternalSource), 626a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor TEnd = TentativeDefinitions.end(); 627a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor T != TEnd; ++T) 628a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor { 629a862320972e63349524dc9aa744dec1b95f54ba1Douglas Gregor VarDecl *VD = (*T)->getActingDefinition(); 630e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl 631e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl // If the tentative definition was completed, getActingDefinition() returns 632e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl // null. If we've already seen this variable before, insert()'s second 633e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl // return value is false. 634e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl if (VD == 0 || VD->isInvalidDecl() || !Seen.insert(VD)) 635b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor continue; 636b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const IncompleteArrayType *ArrayT 638b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor = Context.getAsIncompleteArrayType(VD->getType())) { 6391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (RequireCompleteType(VD->getLocation(), 640b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor ArrayT->getElementType(), 64163d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner diag::err_tentative_def_incomplete_type_arr)) { 642b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor VD->setInvalidDecl(); 64363d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner continue; 644275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor } 6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64663d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner // Set the length of the array to 1 (C99 6.9.2p5). 64763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner Diag(VD->getLocation(), diag::warn_tentative_incomplete_array); 64863d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner llvm::APInt One(Context.getTypeSize(Context.getSizeType()), true); 64946a617a792bfab0d9b1e057371ea3b9540802226John McCall QualType T = Context.getConstantArrayType(ArrayT->getElementType(), 65046a617a792bfab0d9b1e057371ea3b9540802226John McCall One, ArrayType::Normal, 0); 65163d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner VD->setType(T); 6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (RequireCompleteType(VD->getLocation(), VD->getType(), 653b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor diag::err_tentative_def_incomplete_type)) 654b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor VD->setInvalidDecl(); 655b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 656b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor // Notify the consumer that we've completed a tentative definition. 657b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor if (!VD->isInvalidDecl()) 658b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor Consumer.CompleteTentativeDefinition(VD); 659b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor 660275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor } 66143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis 662c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt if (LangOpts.CPlusPlus0x && 663c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt Diags.getDiagnosticLevel(diag::warn_delegating_ctor_cycle, 664c1598700010cea9364a58a65e967b0b56361b6aaSean Hunt SourceLocation()) 665d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie != DiagnosticsEngine::Ignored) 666fe57eef44cc80e5bb51e4f484835be08b8d84256Sean Hunt CheckDelegatingCtorCycles(); 667fe57eef44cc80e5bb51e4f484835be08b8d84256Sean Hunt 66843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis // If there were errors, disable 'unused' warnings since they will mostly be 66943f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis // noise. 67043f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis if (!Diags.hasErrorOccurred()) { 67143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis // Output warning for unused file scoped decls. 672a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor for (UnusedFileScopedDeclsType::iterator 673a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor I = UnusedFileScopedDecls.begin(ExternalSource), 67443f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis E = UnusedFileScopedDecls.end(); I != E; ++I) { 675a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor if (ShouldRemoveFromUnused(this, *I)) 676a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor continue; 677a2ee20aa9660851080135219cac5b31fbac08b78Douglas Gregor 67843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) { 67943f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis const FunctionDecl *DiagD; 68043f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis if (!FD->hasBody(DiagD)) 68143f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis DiagD = FD; 68248b89590f61575cbf365ba996a2bd1ba1561a4abArgyrios Kyrtzidis if (DiagD->isDeleted()) 68348b89590f61575cbf365ba996a2bd1ba1561a4abArgyrios Kyrtzidis continue; // Deleted functions are supposed to be unused. 6846b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis if (DiagD->isReferenced()) { 6856b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis if (isa<CXXMethodDecl>(DiagD)) 6866b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis Diag(DiagD->getLocation(), diag::warn_unneeded_member_function) 6876b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis << DiagD->getDeclName(); 68812d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian else { 68912d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian if (FD->getStorageClassAsWritten() == SC_Static && 69012d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian !FD->isInlineSpecified() && 69112d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian !SourceMgr.isFromMainFile( 69212d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian SourceMgr.getExpansionLoc(FD->getLocation()))) 69312d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian Diag(DiagD->getLocation(), diag::warn_unneeded_static_internal_decl) 69412d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian << DiagD->getDeclName(); 69512d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian else 69612d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl) 69712d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian << /*function*/0 << DiagD->getDeclName(); 69812d2cc71bfeb1e7be9ce00fc52feab50941cac24Fariborz Jahanian } 6996b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } else { 7006b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis Diag(DiagD->getLocation(), 7016b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function 7026b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis : diag::warn_unused_function) 7036b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis << DiagD->getDeclName(); 7046b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } 70543f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis } else { 70643f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition(); 70743f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis if (!DiagD) 70843f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis DiagD = cast<VarDecl>(*I); 7096b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis if (DiagD->isReferenced()) { 7106b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl) 7116b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis << /*variable*/1 << DiagD->getDeclName(); 7126b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } else { 7136b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis Diag(DiagD->getLocation(), diag::warn_unused_variable) 7146b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis << DiagD->getDeclName(); 7156b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } 71643f0a7c8e06e55092b43d4dd46fe09a4d57298e9Argyrios Kyrtzidis } 717bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis } 71815e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall 71915e310a3b970b64a84cb30f0005bc396b4d978cbJohn McCall checkUndefinedInternals(*this); 72049b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis } 72187c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor 722f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (Diags.getDiagnosticLevel(diag::warn_unused_private_field, 723f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper SourceLocation()) 724f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper != DiagnosticsEngine::Ignored) { 725f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap RecordsComplete; 726f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper RecordCompleteMap MNCComplete; 727f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper for (NamedDeclSetType::iterator I = UnusedPrivateFields.begin(), 728f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper E = UnusedPrivateFields.end(); I != E; ++I) { 729f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper const NamedDecl *D = *I; 730f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext()); 731f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper if (RD && !RD->isUnion() && 732f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper IsRecordFullyDefined(RD, RecordsComplete, MNCComplete)) { 733f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper Diag(D->getLocation(), diag::warn_unused_private_field) 734f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper << D->getDeclName(); 735f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 736f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 737f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper } 738f8cc02e50553b5c3bc6570bff0c47ac7db85fe8dDaniel Jasper 739483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // Check we've noticed that we're no longer parsing the initializer for every 740483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // variable. If we miss cases, then at best we have a performance issue and 741483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith // at worst a rejects-valid bug. 742483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith assert(ParsingInitForAutoVars.empty() && 743483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith "Didn't unmark var as having its initializer parsed"); 744483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smith 74587c08a5d6b9e1e44ae6f554df40139d3a6f60b33Douglas Gregor TUScope = 0; 7469299f3fa85796613cc787a2062c9562d07c8613eChris Lattner} 7479299f3fa85796613cc787a2062c9562d07c8613eChris Lattner 7489299f3fa85796613cc787a2062c9562d07c8613eChris Lattner 7495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 7505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Helper functions. 7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 7525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 7538517d9b731f065cdfc55ec0f3ddf5d564d988648Anders CarlssonDeclContext *Sema::getFunctionLevelDeclContext() { 754db0ee1da16e9dbec19b144c9cd96ee9f55fe0c53John McCall DeclContext *DC = CurContext; 7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75672899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman while (true) { 75772899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC)) { 75872899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman DC = DC->getParent(); 75972899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman } else if (isa<CXXMethodDecl>(DC) && 760215e4e17d00e12c38687a95502506d8f2ca3e646Douglas Gregor cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call && 76172899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman cast<CXXRecordDecl>(DC->getParent())->isLambda()) { 76272899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman DC = DC->getParent()->getParent(); 76372899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman } 76472899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman else break; 76572899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman } 7661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7678517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson return DC; 7688517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson} 7698517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson 770371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// getCurFunctionDecl - If inside of a function body, this returns a pointer 771371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// to the function decl for the function being parsed. If we're currently 772371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner/// in a 'block', this returns the containing context. 773371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerFunctionDecl *Sema::getCurFunctionDecl() { 7748517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson DeclContext *DC = getFunctionLevelDeclContext(); 775371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner return dyn_cast<FunctionDecl>(DC); 776371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner} 777371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner 778c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel DunbarObjCMethodDecl *Sema::getCurMethodDecl() { 7798517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson DeclContext *DC = getFunctionLevelDeclContext(); 780d7612e183bb09d04677d0ddde89ee29130ffb715Steve Naroff return dyn_cast<ObjCMethodDecl>(DC); 781c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar} 782371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner 783371f258e61e1365b951b17931a3c5ac1530fd1a0Chris LattnerNamedDecl *Sema::getCurFunctionOrMethodDecl() { 7848517d9b731f065cdfc55ec0f3ddf5d564d988648Anders Carlsson DeclContext *DC = getFunctionLevelDeclContext(); 785371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC)) 7864afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor return cast<NamedDecl>(DC); 787371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner return 0; 788371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner} 789371f258e61e1365b951b17931a3c5ac1530fd1a0Chris Lattner 790393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbarvoid Sema::EmitCurrentDiagnostic(unsigned DiagID) { 791393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // FIXME: It doesn't make sense to me that DiagID is an incoming argument here 792393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // and yet we also use the current diag ID on the DiagnosticsEngine. This has 793393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // been made more painfully obvious by the refactor that introduced this 794393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // function, but it is possible that the incoming argument can be 795393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // eliminnated. If it truly cannot be (for example, there is some reentrancy 796393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // issue I am not seeing yet), then there should at least be a clarifying 797393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar // comment somewhere. 798393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar if (llvm::Optional<TemplateDeductionInfo*> Info = isSFINAEContext()) { 799393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar switch (DiagnosticIDs::getDiagnosticSFINAEResponse( 800393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.getCurrentDiagID())) { 80133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis case DiagnosticIDs::SFINAE_Report: 80277faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // We'll report the diagnostic below. 8039b623639378d53a675921ddfa7316034d571881eDouglas Gregor break; 8049b623639378d53a675921ddfa7316034d571881eDouglas Gregor 80577faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith case DiagnosticIDs::SFINAE_SubstitutionFailure: 80677faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // Count this failure so that we know that template argument deduction 80777faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // has failed. 808393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar ++NumSFINAEErrors; 809b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith 810b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith // Make a copy of this suppressed diagnostic and store it with the 811b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith // template-deduction information. 812b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith if (*Info && !(*Info)->hasSFINAEDiagnostic()) { 813b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith Diagnostic DiagInfo(&Diags); 814b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith (*Info)->addSFINAEDiagnostic(DiagInfo.getLocation(), 815b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); 816b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith } 817b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith 818393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.setLastDiagnosticIgnored(); 819393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.Clear(); 82077faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith return; 82177faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith 82277faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith case DiagnosticIDs::SFINAE_AccessControl: { 8237822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor // Per C++ Core Issue 1170, access control is part of SFINAE. 82400b43848e4a320b0845c1004694fa50920096c75Daniel Dunbar // Additionally, the AccessCheckingSFINAE flag can be used to temporarily 8257822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor // make access control a part of SFINAE for the purposes of checking 8267822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor // type traits. 827393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar if (!AccessCheckingSFINAE && !getLangOpts().CPlusPlus0x) 8281eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor break; 82977faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith 830393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar SourceLocation Loc = Diags.getCurrentDiagLoc(); 83177faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith 83277faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // Suppress this diagnostic. 833393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar ++NumSFINAEErrors; 834b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith 835b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith // Make a copy of this suppressed diagnostic and store it with the 836b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith // template-deduction information. 837b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith if (*Info && !(*Info)->hasSFINAEDiagnostic()) { 838b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith Diagnostic DiagInfo(&Diags); 839b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith (*Info)->addSFINAEDiagnostic(DiagInfo.getLocation(), 840b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); 841b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith } 842b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith 843393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.setLastDiagnosticIgnored(); 844393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.Clear(); 84577faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith 84677faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // Now the diagnostic state is clear, produce a C++98 compatibility 84777faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // warning. 848393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control); 84977faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith 85077faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // The last diagnostic which Sema produced was ignored. Suppress any 85177faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith // notes attached to it. 852393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.setLastDiagnosticIgnored(); 8539b623639378d53a675921ddfa7316034d571881eDouglas Gregor return; 85477faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith } 85577faa365cb2322cfc8edf58a4f5d68f2370cc39aRichard Smith 85633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis case DiagnosticIDs::SFINAE_Suppress: 8579b623639378d53a675921ddfa7316034d571881eDouglas Gregor // Make a copy of this suppressed diagnostic and store it with the 8589b623639378d53a675921ddfa7316034d571881eDouglas Gregor // template-deduction information; 859b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith if (*Info) { 860b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith Diagnostic DiagInfo(&Diags); 8611eee5dc0465c0ab4810e21d365e881152d7f53c0Douglas Gregor (*Info)->addSuppressedDiagnostic(DiagInfo.getLocation(), 862b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith PartialDiagnostic(DiagInfo, Context.getDiagAllocator())); 863b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith } 864b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith 865b8590f3572158bde97f14037c4cc8f4a57c8d810Richard Smith // Suppress this diagnostic. 866393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.setLastDiagnosticIgnored(); 867393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Diags.Clear(); 8689b623639378d53a675921ddfa7316034d571881eDouglas Gregor return; 8699b623639378d53a675921ddfa7316034d571881eDouglas Gregor } 8709b623639378d53a675921ddfa7316034d571881eDouglas Gregor } 8719b623639378d53a675921ddfa7316034d571881eDouglas Gregor 8728987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor // Set up the context's printing policy based on our current state. 873393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar Context.setPrintingPolicy(getPrintingPolicy()); 8748987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor 8759b623639378d53a675921ddfa7316034d571881eDouglas Gregor // Emit the diagnostic. 876393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar if (!Diags.EmitCurrentDiagnostic()) 8775e9f35c7cb61aea46f56d46c77cbcf47c0cf28baDouglas Gregor return; 8781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 87925a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor // If this is not a note, and we're in a template instantiation 88025a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor // that is different from the last template instantiation where 88125a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor // we emitted an error, print a template instantiation 88225a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor // backtrace. 88333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis if (!DiagnosticIDs::isBuiltinNote(DiagID) && 884393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar !ActiveTemplateInstantiations.empty() && 885393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar ActiveTemplateInstantiations.back() 886393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar != LastTemplateInstantiationErrorContext) { 887393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar PrintInstantiationStack(); 888393eed7fb901e49085c8583ff0439d1273b6f2feDaniel Dunbar LastTemplateInstantiationErrorContext = ActiveTemplateInstantiations.back(); 88925a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor } 89025a88bbf042317976f0d9cbfa87dfe89426e8393Douglas Gregor} 8912e22253e03e175144aeb9d13350a12fd83f858beDouglas Gregor 89291a0cc913ecc5619b76d2e40742fd09725be8c56Anders CarlssonSema::SemaDiagnosticBuilder 89391a0cc913ecc5619b76d2e40742fd09725be8c56Anders CarlssonSema::Diag(SourceLocation Loc, const PartialDiagnostic& PD) { 89491a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson SemaDiagnosticBuilder Builder(Diag(Loc, PD.getDiagID())); 89591a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson PD.Emit(Builder); 8961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 89791a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson return Builder; 89891a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson} 89991a0cc913ecc5619b76d2e40742fd09725be8c56Anders Carlsson 900108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// \brief Looks through the macro-expansion chain for the given 901108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// location, looking for a macro expansion with the given name. 902834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall/// If one is found, returns true and sets the location to that 903108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth/// expansion loc. 9045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool Sema::findMacroSpelling(SourceLocation &locref, StringRef name) { 905834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall SourceLocation loc = locref; 906834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall if (!loc.isMacroID()) return false; 907834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall 908834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall // There's no good way right now to look at the intermediate 909108f756bebd991eaa980cfb9994353612a2e5ff6Chandler Carruth // expansions, so just jump to the expansion location. 910402785357ab053dd53f4fdd858b9630a5e0f8badChandler Carruth loc = getSourceManager().getExpansionLoc(loc); 911834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall 912834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall // If that's written with the name, stop here. 9135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<char, 16> buffer; 914834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall if (getPreprocessor().getSpelling(loc, buffer) == name) { 915834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall locref = loc; 916834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall return true; 917834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall } 918834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall return false; 919834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall} 920834e3f6c77d9ac03997a3f0c56934edcf406a355John McCall 92123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// \brief Determines the active Scope associated with the given declaration 92223c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// context. 92323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// 92423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// This routine maps a declaration context to the active Scope object that 92523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// represents that declaration context in the parser. It is typically used 92623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// from "scope-less" code (e.g., template instantiation, lazy creation of 92723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// declarations) that injects a name for name-lookup purposes and, therefore, 92823c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// must update the Scope. 92923c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// 93023c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// \returns The scope corresponding to the given declaraion context, or NULL 93123c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor/// if no such scope is open. 93223c94dbb6631fecdb55ba401aa93722803d980c6Douglas GregorScope *Sema::getScopeForContext(DeclContext *Ctx) { 93323c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor 93423c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor if (!Ctx) 93523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor return 0; 93623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor 93723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor Ctx = Ctx->getPrimaryContext(); 93823c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor for (Scope *S = getCurScope(); S; S = S->getParent()) { 939cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl // Ignore scopes that cannot have declarations. This is important for 940cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl // out-of-line definitions of static class members. 941cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope)) 942cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl if (DeclContext *Entity = static_cast<DeclContext *> (S->getEntity())) 943cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl if (Ctx == Entity->getPrimaryContext()) 944cddc69fc3fe17b043a287a41e3706766c3d09a79Sebastian Redl return S; 94523c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor } 94623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor 94723c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor return 0; 94823c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor} 9499ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 9509ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// \brief Enter a new function scope 9519ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregorvoid Sema::PushFunctionScope() { 952781472fe99a120098c631b0cbe33c89f8cef5e70John McCall if (FunctionScopes.size() == 1) { 953781472fe99a120098c631b0cbe33c89f8cef5e70John McCall // Use the "top" function scope rather than having to allocate 954781472fe99a120098c631b0cbe33c89f8cef5e70John McCall // memory for a new scope. 9558fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis FunctionScopes.back()->Clear(); 956781472fe99a120098c631b0cbe33c89f8cef5e70John McCall FunctionScopes.push_back(FunctionScopes.back()); 9579ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor return; 9589ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor } 9599ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 9608fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis FunctionScopes.push_back(new FunctionScopeInfo(getDiagnostics())); 9619ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor} 9629ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 9639ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregorvoid Sema::PushBlockScope(Scope *BlockScope, BlockDecl *Block) { 9648fc32d272bd57b0a59f61c874cb7b56d9005e89eArgyrios Kyrtzidis FunctionScopes.push_back(new BlockScopeInfo(getDiagnostics(), 9659ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor BlockScope, Block)); 9669ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor} 9679ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 96876e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregorvoid Sema::PushLambdaScope(CXXRecordDecl *Lambda, 96976e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor CXXMethodDecl *CallOperator) { 97076e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor FunctionScopes.push_back(new LambdaScopeInfo(getDiagnostics(), Lambda, 97176e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor CallOperator)); 972ec9ea7200718478e8a976529defbe21942a11c9cEli Friedman} 973ec9ea7200718478e8a976529defbe21942a11c9cEli Friedman 974ec9ea7200718478e8a976529defbe21942a11c9cEli Friedmanvoid Sema::PopFunctionScopeInfo(const AnalysisBasedWarnings::Policy *WP, 975ec9ea7200718478e8a976529defbe21942a11c9cEli Friedman const Decl *D, const BlockExpr *blkExpr) { 9763ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek FunctionScopeInfo *Scope = FunctionScopes.pop_back_val(); 977781472fe99a120098c631b0cbe33c89f8cef5e70John McCall assert(!FunctionScopes.empty() && "mismatched push/pop!"); 9783ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek 9793ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek // Issue any analysis-based warnings. 9803ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek if (WP && D) 981283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek AnalysisWarnings.IssueWarnings(*WP, Scope, D, blkExpr); 982351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek else { 9835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (SmallVectorImpl<sema::PossiblyUnreachableDiag>::iterator 984351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek i = Scope->PossiblyUnreachableDiags.begin(), 985351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek e = Scope->PossiblyUnreachableDiags.end(); 986351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek i != e; ++i) { 987351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek const sema::PossiblyUnreachableDiag &D = *i; 988351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek Diag(D.Loc, D.PD); 989351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek } 990351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek } 9913ed6fc08a9cd293d012fa49ab2a615e618d7c3faTed Kremenek 992351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek if (FunctionScopes.back() != Scope) { 993781472fe99a120098c631b0cbe33c89f8cef5e70John McCall delete Scope; 994351ba91eaa6d30e523587b2d7ed676a5172c6e56Ted Kremenek } 9959ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor} 9969ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 997625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenkovoid Sema::PushCompoundScope() { 998625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko getCurFunction()->CompoundScopes.push_back(CompoundScopeInfo()); 999625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko} 1000625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko 1001625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenkovoid Sema::PopCompoundScope() { 1002625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko FunctionScopeInfo *CurFunction = getCurFunction(); 1003625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko assert(!CurFunction->CompoundScopes.empty() && "mismatched push/pop"); 1004625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko 1005625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko CurFunction->CompoundScopes.pop_back(); 1006625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko} 1007625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko 10089ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// \brief Determine whether any errors occurred within this function/method/ 10099ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor/// block. 1010f85e193739c953358c865005855253af4f68a497John McCallbool Sema::hasAnyUnrecoverableErrorsInThisFunction() const { 1011f85e193739c953358c865005855253af4f68a497John McCall return getCurFunction()->ErrorTrap.hasUnrecoverableErrorOccurred(); 10129ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor} 10139ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 10149ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas GregorBlockScopeInfo *Sema::getCurBlock() { 10159ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor if (FunctionScopes.empty()) 10169ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor return 0; 10179ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor 10189ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor return dyn_cast<BlockScopeInfo>(FunctionScopes.back()); 10199ea9bdbc14374f7bacdb50d3e52c664ff12150ffDouglas Gregor} 102076bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall 1021906a7e1c0f272f7e539c82dda01f4644031ce637Eli FriedmanLambdaScopeInfo *Sema::getCurLambda() { 1022906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman if (FunctionScopes.empty()) 1023906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman return 0; 1024906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman 1025906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman return dyn_cast<LambdaScopeInfo>(FunctionScopes.back()); 1026906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman} 1027906a7e1c0f272f7e539c82dda01f4644031ce637Eli Friedman 1028aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkovoid Sema::ActOnComment(SourceRange Comment) { 1029aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko RawComment RC(SourceMgr, Comment); 10309dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko if (RC.isAlmostTrailingComment()) { 10319dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko SourceRange MagicMarkerRange(Comment.getBegin(), 10329dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko Comment.getBegin().getLocWithOffset(3)); 10339dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko StringRef MagicMarkerText; 10349dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko switch (RC.getKind()) { 1035c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara case RawComment::RCK_OrdinaryBCPL: 10369dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko MagicMarkerText = "///<"; 10379dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko break; 1038c50a0e3900f1b44503be48457508af372f4dd05aAbramo Bagnara case RawComment::RCK_OrdinaryC: 10399dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko MagicMarkerText = "/**<"; 10409dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko break; 10419dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko default: 10429dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko llvm_unreachable("if this is an almost Doxygen comment, " 10439dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko "it should be ordinary"); 10449dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko } 10459dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko Diag(Comment.getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) << 10469dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko FixItHint::CreateReplacement(MagicMarkerRange, MagicMarkerText); 10479dda4746867a747c1c3421d8a04a1b666aeb5809Dmitri Gribenko } 1048aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko Context.addComment(RC); 1049aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko} 1050aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko 105176bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCall// Pin this vtable to this file. 105276bd1f387e6a7b7abfe53f63b3bd429b97bb80f0John McCallExternalSemaSource::~ExternalSemaSource() {} 1053f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall 10545ac4b6917aa34fae6da64036539023a6155a3d48Douglas Gregorvoid ExternalSemaSource::ReadMethodPool(Selector Sel) { } 10558c84571f3e262569ba51d107db7ab31a23de79b3Sebastian Redl 1056d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregorvoid ExternalSemaSource::ReadKnownNamespaces( 10575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<NamespaceDecl *> &Namespaces) { 1058d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor} 1059d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor 10605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid PrettyDeclStackTraceEntry::print(raw_ostream &OS) const { 1061f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall SourceLocation Loc = this->Loc; 1062f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation(); 1063f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (Loc.isValid()) { 1064f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Loc.print(OS, S.getSourceManager()); 1065f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall OS << ": "; 1066f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall } 1067f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall OS << Message; 1068f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall 1069f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (TheDecl && isa<NamedDecl>(TheDecl)) { 1070f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall std::string Name = cast<NamedDecl>(TheDecl)->getNameAsString(); 1071f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall if (!Name.empty()) 1072f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall OS << " '" << Name << '\''; 1073f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall } 1074f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall 1075f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall OS << '\n'; 1076f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall} 1077c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay 1078c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \brief Figure out if an expression could be turned into a call. 1079c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// 1080c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// Use this when trying to recover from an error where the programmer may have 1081c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// written just the name of a function instead of actually calling it. 1082c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// 1083c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param E - The expression to examine. 1084c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param ZeroArgCallReturnTy - If the expression can be turned into a call 1085c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// with no arguments, this parameter is set to the type returned by such a 1086c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// call; otherwise, it is set to an empty QualType. 10876dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// \param OverloadSet - If the expression is an overloaded function 1088c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// name, this parameter is populated with the decls of the various overloads. 1089c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gaybool Sema::isExprCallable(const Expr &E, QualType &ZeroArgCallReturnTy, 10906dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall UnresolvedSetImpl &OverloadSet) { 1091c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay ZeroArgCallReturnTy = QualType(); 10926dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall OverloadSet.clear(); 10936dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 10946dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (E.getType() == Context.OverloadTy) { 10956dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall OverloadExpr::FindResult FR = OverloadExpr::find(const_cast<Expr*>(&E)); 10966dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall const OverloadExpr *Overloads = FR.Expression; 10976dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 1098c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay for (OverloadExpr::decls_iterator it = Overloads->decls_begin(), 1099c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay DeclsEnd = Overloads->decls_end(); it != DeclsEnd; ++it) { 11006dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall OverloadSet.addDecl(*it); 11016dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 11026dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // Check whether the function is a non-template which takes no 11036dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // arguments. 11046dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (const FunctionDecl *OverloadDecl 11056dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) { 1106c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (OverloadDecl->getMinRequiredArguments() == 0) 1107c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay ZeroArgCallReturnTy = OverloadDecl->getResultType(); 1108c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 1109c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 11106dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 111164a371ff8d525880e519a43fc522cbdc79fc4a89Douglas Gregor // Ignore overloads that are pointer-to-member constants. 111264a371ff8d525880e519a43fc522cbdc79fc4a89Douglas Gregor if (FR.HasFormOfMemberPointer) 11136dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return false; 11146dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 1115c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay return true; 1116c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 1117c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay 11186dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (const DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E.IgnoreParens())) { 1119c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (const FunctionDecl *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) { 1120c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (Fun->getMinRequiredArguments() == 0) 1121c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay ZeroArgCallReturnTy = Fun->getResultType(); 1122c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay return true; 1123c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 1124c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 1125c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay 1126c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // We don't have an expression that's convenient to get a FunctionDecl from, 1127c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // but we can at least check if the type is "function of 0 arguments". 1128c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay QualType ExprTy = E.getType(); 1129c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay const FunctionType *FunTy = NULL; 11309389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay QualType PointeeTy = ExprTy->getPointeeType(); 11319389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay if (!PointeeTy.isNull()) 11329389ddc29ec60931e4dc418541ba3470b6b9fbe0Matt Beaumont-Gay FunTy = PointeeTy->getAs<FunctionType>(); 1133c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (!FunTy) 1134c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay FunTy = ExprTy->getAs<FunctionType>(); 1135c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (!FunTy && ExprTy == Context.BoundMemberTy) { 1136c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // Look for the bound-member type. If it's still overloaded, give up, 1137c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // although we probably should have fallen into the OverloadExpr case above 1138c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // if we actually have an overloaded bound member. 1139c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay QualType BoundMemberTy = Expr::findBoundMemberType(&E); 1140c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (!BoundMemberTy.isNull()) 1141c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay FunTy = BoundMemberTy->castAs<FunctionType>(); 1142c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 1143c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay 1144c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (const FunctionProtoType *FPT = 1145c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay dyn_cast_or_null<FunctionProtoType>(FunTy)) { 1146c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (FPT->getNumArgs() == 0) 1147c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay ZeroArgCallReturnTy = FunTy->getResultType(); 1148c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay return true; 1149c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 1150c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay return false; 1151c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay} 1152c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay 1153c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \brief Give notes for a set of overloads. 1154c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// 1155c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// A companion to isExprCallable. In cases when the name that the programmer 1156c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// wrote was an overloaded function, we may be able to make some guesses about 1157c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// plausible overloads based on their return types; such guesses can be handed 1158c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// off to this method to be emitted as notes. 1159c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// 1160c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param Overloads - The overloads to note. 1161c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// \param FinalNoteLoc - If we've suppressed printing some overloads due to 1162c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// -fshow-overloads=best, this is the location to attach to the note about too 1163c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// many candidates. Typically this will be the location of the original 1164c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay/// ill-formed expression. 11656dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads, 11666dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall const SourceLocation FinalNoteLoc) { 1167c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay int ShownOverloads = 0; 1168c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay int SuppressedOverloads = 0; 1169c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay for (UnresolvedSetImpl::iterator It = Overloads.begin(), 1170c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) { 1171c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // FIXME: Magic number for max shown overloads stolen from 1172c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay // OverloadCandidateSet::NoteCandidates. 1173c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (ShownOverloads >= 4 && 11746dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall S.Diags.getShowOverloads() == DiagnosticsEngine::Ovl_Best) { 1175c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay ++SuppressedOverloads; 1176c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay continue; 1177c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 11786dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 11796dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall NamedDecl *Fn = (*It)->getUnderlyingDecl(); 11809c0e1ec7b3afd833c1b958ce2aeedff71c7eb4c5Abramo Bagnara S.Diag(Fn->getLocation(), diag::note_possible_target_of_call); 1181c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay ++ShownOverloads; 1182c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay } 11836dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 1184c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay if (SuppressedOverloads) 11856dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall S.Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates) 11866dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall << SuppressedOverloads; 11876dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall} 11886dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 11896dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic void notePlausibleOverloads(Sema &S, SourceLocation Loc, 11906dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall const UnresolvedSetImpl &Overloads, 11916dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall bool (*IsPlausibleResult)(QualType)) { 11926dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (!IsPlausibleResult) 11936dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return noteOverloads(S, Overloads, Loc); 11946dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 11956dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall UnresolvedSet<2> PlausibleOverloads; 11966dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall for (OverloadExpr::decls_iterator It = Overloads.begin(), 11976dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall DeclsEnd = Overloads.end(); It != DeclsEnd; ++It) { 11986dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It); 11996dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall QualType OverloadResultTy = OverloadDecl->getResultType(); 12006dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (IsPlausibleResult(OverloadResultTy)) 12016dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall PlausibleOverloads.addDecl(It.getDecl()); 12026dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall } 12036dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall noteOverloads(S, PlausibleOverloads, Loc); 12046dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall} 12056dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 12066dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// Determine whether the given expression can be called by just 12076dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// putting parentheses after it. Notably, expressions with unary 12086dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// operators can't be because the unary operator will start parsing 12096dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall/// outside the call. 12106dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallstatic bool IsCallableWithAppend(Expr *E) { 12116dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall E = E->IgnoreImplicit(); 12126dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return (!isa<CStyleCastExpr>(E) && 12136dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall !isa<UnaryOperator>(E) && 12146dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall !isa<BinaryOperator>(E) && 12156dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall !isa<CXXOperatorCallExpr>(E)); 12166dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall} 12176dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 12186dbba4fc128e2e2f5b26be996392bd32c0707f13John McCallbool Sema::tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, 12196dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall bool ForceComplain, 12206dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall bool (*IsPlausibleResult)(QualType)) { 12216dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall SourceLocation Loc = E.get()->getExprLoc(); 12226dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall SourceRange Range = E.get()->getSourceRange(); 12236dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 12246dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall QualType ZeroArgCallTy; 12256dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall UnresolvedSet<4> Overloads; 12266dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (isExprCallable(*E.get(), ZeroArgCallTy, Overloads) && 12276dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall !ZeroArgCallTy.isNull() && 12286dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) { 12296dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // At this point, we know E is potentially callable with 0 12306dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // arguments and that it returns something of a reasonable type, 12316dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // so we can emit a fixit and carry on pretending that E was 12326dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // actually a CallExpr. 12336dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall SourceLocation ParenInsertionLoc = 12346dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall PP.getLocForEndOfToken(Range.getEnd()); 12356dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall Diag(Loc, PD) 12366dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall << /*zero-arg*/ 1 << Range 12376dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall << (IsCallableWithAppend(E.get()) 12386dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall ? FixItHint::CreateInsertion(ParenInsertionLoc, "()") 12396dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall : FixItHint()); 12406dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult); 12416dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 12426dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // FIXME: Try this before emitting the fixit, and suppress diagnostics 12436dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall // while doing so. 12446dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall E = ActOnCallExpr(0, E.take(), ParenInsertionLoc, 12455354e77e60e82828c7c2361f5c688c2667ab59ccBenjamin Kramer MultiExprArg(), ParenInsertionLoc.getLocWithOffset(1)); 12466dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return true; 12476dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall } 12486dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 12496dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (!ForceComplain) return false; 12506dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall 12516dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall Diag(Loc, PD) << /*not zero-arg*/ 0 << Range; 12526dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall notePlausibleOverloads(*this, Loc, Overloads, IsPlausibleResult); 12536dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall E = ExprError(); 12546dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall return true; 1255c9366ba8fff6461a5b7f0fd2626d1bce3e98e629Matt Beaumont-Gay} 1256