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