diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/AST/DeclBase.cpp | 2 | ||||
| -rw-r--r-- | lib/AST/ODRHash.cpp | 2 | ||||
| -rw-r--r-- | lib/CodeGen/CGBuiltin.cpp | 6 | ||||
| -rw-r--r-- | lib/CodeGen/ObjectFilePCHContainerOperations.cpp | 5 | ||||
| -rw-r--r-- | lib/Frontend/InitPreprocessor.cpp | 4 | ||||
| -rw-r--r-- | lib/Lex/Lexer.cpp | 19 | ||||
| -rw-r--r-- | lib/Lex/PPCaching.cpp | 4 | ||||
| -rw-r--r-- | lib/Lex/PPLexerChange.cpp | 1 | ||||
| -rw-r--r-- | lib/Sema/Scope.cpp | 99 | ||||
| -rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 4 | ||||
| -rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 3 | ||||
| -rw-r--r-- | lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 7 | ||||
| -rw-r--r-- | lib/StaticAnalyzer/Checkers/ValistChecker.cpp | 18 | 
13 files changed, 87 insertions, 87 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 29ce7ae034b5c..2cdcdae9ab029 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -891,12 +891,14 @@ bool Decl::AccessDeclContextSanity() const {    // 4. the context is not a record    // 5. it's invalid    // 6. it's a C++0x static_assert. +  // 7. it's a block literal declaration    if (isa<TranslationUnitDecl>(this) ||        isa<TemplateTypeParmDecl>(this) ||        isa<NonTypeTemplateParmDecl>(this) ||        !isa<CXXRecordDecl>(getDeclContext()) ||        isInvalidDecl() ||        isa<StaticAssertDecl>(this) || +      isa<BlockDecl>(this) ||        // FIXME: a ParmVarDecl can have ClassTemplateSpecialization        // as DeclContext (?).        isa<ParmVarDecl>(this) || diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp index 088d8bedd453b..38e8d34135f9b 100644 --- a/lib/AST/ODRHash.cpp +++ b/lib/AST/ODRHash.cpp @@ -478,6 +478,8 @@ void ODRHash::AddFunctionDecl(const FunctionDecl *Function) {    // TODO: Fix hashing for class methods.    if (isa<CXXMethodDecl>(Function)) return; +  // And friend functions. +  if (Function->getFriendObjectKind()) return;    // Skip functions that are specializations or in specialization context.    const DeclContext *DC = Function; diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index ba54f8342f1b5..35ae114c4f25f 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -915,7 +915,11 @@ EmitCheckedMixedSignMultiply(CodeGenFunction &CGF, const clang::Expr *Op1,        Overflow = CGF.Builder.CreateOr(Overflow, TruncOverflow);      } -    Result = CGF.Builder.CreateTrunc(UnsignedResult, ResTy); +    // Negate the product if it would be negative in infinite precision. +    Result = CGF.Builder.CreateSelect( +        IsNegative, CGF.Builder.CreateNeg(UnsignedResult), UnsignedResult); + +    Result = CGF.Builder.CreateTrunc(Result, ResTy);    }    assert(Overflow && Result && "Missing overflow or result"); diff --git a/lib/CodeGen/ObjectFilePCHContainerOperations.cpp b/lib/CodeGen/ObjectFilePCHContainerOperations.cpp index d0760b9cc2a60..0fe9f5da07c83 100644 --- a/lib/CodeGen/ObjectFilePCHContainerOperations.cpp +++ b/lib/CodeGen/ObjectFilePCHContainerOperations.cpp @@ -229,6 +229,11 @@ public:        Builder->getModuleDebugInfo()->completeRequiredType(RD);    } +  void HandleImplicitImportDecl(ImportDecl *D) override { +    if (!D->getImportedOwningModule()) +      Builder->getModuleDebugInfo()->EmitImportDecl(*D); +  } +    /// Emit a container holding the serialized AST.    void HandleTranslationUnit(ASTContext &Ctx) override {      assert(M && VMContext && Builder); diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index 639050f7c64b8..321d963827d14 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -817,10 +817,6 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F");    DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), "");    DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L"); -  if (TI.hasFloat128Type()) -    // FIXME: Switch away from the non-standard "Q" when we can -    DefineFloatMacros(Builder, "FLT128", &TI.getFloat128Format(), "Q"); -    // Define a __POINTER_WIDTH__ macro for stdint.h.    Builder.defineMacro("__POINTER_WIDTH__", diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index 830354ab23f0d..8bd4ab0ff9caf 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -2009,18 +2009,21 @@ bool Lexer::LexAngledStringLiteral(Token &Result, const char *CurPtr) {    const char *AfterLessPos = CurPtr;    char C = getAndAdvanceChar(CurPtr, Result);    while (C != '>') { -    // Skip escaped characters. -    if (C == '\\' && CurPtr < BufferEnd) { -      // Skip the escaped character. -      getAndAdvanceChar(CurPtr, Result); -    } else if (C == '\n' || C == '\r' ||             // Newline. -               (C == 0 && (CurPtr-1 == BufferEnd ||  // End of file. -                           isCodeCompletionPoint(CurPtr-1)))) { +    // Skip escaped characters.  Escaped newlines will already be processed by +    // getAndAdvanceChar. +    if (C == '\\') +      C = getAndAdvanceChar(CurPtr, Result); + +    if (C == '\n' || C == '\r' ||             // Newline. +        (C == 0 && (CurPtr-1 == BufferEnd ||  // End of file. +                    isCodeCompletionPoint(CurPtr-1)))) {        // If the filename is unterminated, then it must just be a lone <        // character.  Return this as such.        FormTokenWithChars(Result, AfterLessPos, tok::less);        return true; -    } else if (C == 0) { +    } + +    if (C == 0) {        NulCharacter = CurPtr-1;      }      C = getAndAdvanceChar(CurPtr, Result); diff --git a/lib/Lex/PPCaching.cpp b/lib/Lex/PPCaching.cpp index f5e8cdc25d388..9758557d7b448 100644 --- a/lib/Lex/PPCaching.cpp +++ b/lib/Lex/PPCaching.cpp @@ -105,8 +105,10 @@ void Preprocessor::CachingLex(Token &Result) {  }  void Preprocessor::EnterCachingLexMode() { -  if (InCachingLexMode()) +  if (InCachingLexMode()) { +    assert(CurLexerKind == CLK_CachingLexer && "Unexpected lexer kind");      return; +  }    PushIncludeMacroStack();    CurLexerKind = CLK_CachingLexer; diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index e484e9c4c3a38..f21787338b379 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -444,6 +444,7 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) {        }        CurPPLexer = nullptr; +      recomputeCurLexerKind();        return true;      } diff --git a/lib/Sema/Scope.cpp b/lib/Sema/Scope.cpp index ae5b181c67288..eae5a328bfa2c 100644 --- a/lib/Sema/Scope.cpp +++ b/lib/Sema/Scope.cpp @@ -143,72 +143,43 @@ void Scope::dumpImpl(raw_ostream &OS) const {    if (HasFlags)      OS << "Flags: "; -  while (Flags) { -    if (Flags & FnScope) { -      OS << "FnScope"; -      Flags &= ~FnScope; -    } else if (Flags & BreakScope) { -      OS << "BreakScope"; -      Flags &= ~BreakScope; -    } else if (Flags & ContinueScope) { -      OS << "ContinueScope"; -      Flags &= ~ContinueScope; -    } else if (Flags & DeclScope) { -      OS << "DeclScope"; -      Flags &= ~DeclScope; -    } else if (Flags & ControlScope) { -      OS << "ControlScope"; -      Flags &= ~ControlScope; -    } else if (Flags & ClassScope) { -      OS << "ClassScope"; -      Flags &= ~ClassScope; -    } else if (Flags & BlockScope) { -      OS << "BlockScope"; -      Flags &= ~BlockScope; -    } else if (Flags & TemplateParamScope) { -      OS << "TemplateParamScope"; -      Flags &= ~TemplateParamScope; -    } else if (Flags & FunctionPrototypeScope) { -      OS << "FunctionPrototypeScope"; -      Flags &= ~FunctionPrototypeScope; -    } else if (Flags & FunctionDeclarationScope) { -      OS << "FunctionDeclarationScope"; -      Flags &= ~FunctionDeclarationScope; -    } else if (Flags & AtCatchScope) { -      OS << "AtCatchScope"; -      Flags &= ~AtCatchScope; -    } else if (Flags & ObjCMethodScope) { -      OS << "ObjCMethodScope"; -      Flags &= ~ObjCMethodScope; -    } else if (Flags & SwitchScope) { -      OS << "SwitchScope"; -      Flags &= ~SwitchScope; -    } else if (Flags & TryScope) { -      OS << "TryScope"; -      Flags &= ~TryScope; -    } else if (Flags & FnTryCatchScope) { -      OS << "FnTryCatchScope"; -      Flags &= ~FnTryCatchScope; -    } else if (Flags & SEHTryScope) { -      OS << "SEHTryScope"; -      Flags &= ~SEHTryScope; -    } else if (Flags & SEHExceptScope) { -      OS << "SEHExceptScope"; -      Flags &= ~SEHExceptScope; -    } else if (Flags & OpenMPDirectiveScope) { -      OS << "OpenMPDirectiveScope"; -      Flags &= ~OpenMPDirectiveScope; -    } else if (Flags & OpenMPLoopDirectiveScope) { -      OS << "OpenMPLoopDirectiveScope"; -      Flags &= ~OpenMPLoopDirectiveScope; -    } else if (Flags & OpenMPSimdDirectiveScope) { -      OS << "OpenMPSimdDirectiveScope"; -      Flags &= ~OpenMPSimdDirectiveScope; +  std::pair<unsigned, const char *> FlagInfo[] = { +      {FnScope, "FnScope"}, +      {BreakScope, "BreakScope"}, +      {ContinueScope, "ContinueScope"}, +      {DeclScope, "DeclScope"}, +      {ControlScope, "ControlScope"}, +      {ClassScope, "ClassScope"}, +      {BlockScope, "BlockScope"}, +      {TemplateParamScope, "TemplateParamScope"}, +      {FunctionPrototypeScope, "FunctionPrototypeScope"}, +      {FunctionDeclarationScope, "FunctionDeclarationScope"}, +      {AtCatchScope, "AtCatchScope"}, +      {ObjCMethodScope, "ObjCMethodScope"}, +      {SwitchScope, "SwitchScope"}, +      {TryScope, "TryScope"}, +      {FnTryCatchScope, "FnTryCatchScope"}, +      {OpenMPDirectiveScope, "OpenMPDirectiveScope"}, +      {OpenMPLoopDirectiveScope, "OpenMPLoopDirectiveScope"}, +      {OpenMPSimdDirectiveScope, "OpenMPSimdDirectiveScope"}, +      {EnumScope, "EnumScope"}, +      {SEHTryScope, "SEHTryScope"}, +      {SEHExceptScope, "SEHExceptScope"}, +      {SEHFilterScope, "SEHFilterScope"}, +      {CompoundStmtScope, "CompoundStmtScope"}, +      {ClassInheritanceScope, "ClassInheritanceScope"}}; + +  for (auto Info : FlagInfo) { +    if (Flags & Info.first) { +      OS << Info.second; +      Flags &= ~Info.first; +      if (Flags) +        OS << " | ";      } - -    if (Flags) -      OS << " | ";    } + +  assert(Flags == 0 && "Unknown scope flags"); +    if (HasFlags)      OS << '\n'; diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index 3a0f2ff0004be..d09cf9933ecf4 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -502,6 +502,10 @@ DeduceTemplateArguments(Sema &S,                          SmallVectorImpl<DeducedTemplateArgument> &Deduced) {    assert(Arg.isCanonical() && "Argument type must be canonical"); +  // Treat an injected-class-name as its underlying template-id. +  if (auto *Injected = dyn_cast<InjectedClassNameType>(Arg)) +    Arg = Injected->getInjectedSpecializationType(); +    // Check whether the template argument is a dependent template-id.    if (const TemplateSpecializationType *SpecArg          = dyn_cast<TemplateSpecializationType>(Arg)) { diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index ab68e7e671de6..9163fbc6f7e80 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4160,7 +4160,8 @@ void Sema::BuildVariableInstantiation(    // it right away if the type contains 'auto'.    if ((!isa<VarTemplateSpecializationDecl>(NewVar) &&         !InstantiatingVarTemplate && -       !(OldVar->isInline() && OldVar->isThisDeclarationADefinition())) || +       !(OldVar->isInline() && OldVar->isThisDeclarationADefinition() && +         !NewVar->isThisDeclarationADefinition())) ||        NewVar->getType()->isUndeducedType())      InstantiateVariableInitializer(NewVar, OldVar, TemplateArgs); diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 851114004b963..904c9ffa37df4 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -2900,8 +2900,13 @@ void ento::registerNewDeleteLeaksChecker(CheckerManager &mgr) {        mgr.getCurrentCheckName();    // We currently treat NewDeleteLeaks checker as a subchecker of NewDelete    // checker. -  if (!checker->ChecksEnabled[MallocChecker::CK_NewDeleteChecker]) +  if (!checker->ChecksEnabled[MallocChecker::CK_NewDeleteChecker]) {      checker->ChecksEnabled[MallocChecker::CK_NewDeleteChecker] = true; +    // FIXME: This does not set the correct name, but without this workaround +    //        no name will be set at all. +    checker->CheckNames[MallocChecker::CK_NewDeleteChecker] = +        mgr.getCurrentCheckName(); +  }  }  #define REGISTER_CHECKER(name)                                                 \ diff --git a/lib/StaticAnalyzer/Checkers/ValistChecker.cpp b/lib/StaticAnalyzer/Checkers/ValistChecker.cpp index 06c4ef71d80bc..1ebac2118a42b 100644 --- a/lib/StaticAnalyzer/Checkers/ValistChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/ValistChecker.cpp @@ -64,7 +64,7 @@ private:                                   CheckerContext &C) const;    void reportLeakedVALists(const RegionVector &LeakedVALists, StringRef Msg1,                             StringRef Msg2, CheckerContext &C, ExplodedNode *N, -                           bool ForceReport = false) const; +                           bool ReportUninit = false) const;    void checkVAListStartCall(const CallEvent &Call, CheckerContext &C,                              bool IsCopy) const; @@ -267,15 +267,19 @@ void ValistChecker::reportUninitializedAccess(const MemRegion *VAList,  void ValistChecker::reportLeakedVALists(const RegionVector &LeakedVALists,                                          StringRef Msg1, StringRef Msg2,                                          CheckerContext &C, ExplodedNode *N, -                                        bool ForceReport) const { +                                        bool ReportUninit) const {    if (!(ChecksEnabled[CK_Unterminated] || -        (ChecksEnabled[CK_Uninitialized] && ForceReport))) +        (ChecksEnabled[CK_Uninitialized] && ReportUninit)))      return;    for (auto Reg : LeakedVALists) {      if (!BT_leakedvalist) { -      BT_leakedvalist.reset(new BugType(CheckNames[CK_Unterminated], -                                        "Leaked va_list", -                                        categories::MemoryError)); +      // FIXME: maybe creating a new check name for this type of bug is a better +      // solution. +      BT_leakedvalist.reset( +          new BugType(CheckNames[CK_Unterminated].getName().empty() +                          ? CheckNames[CK_Uninitialized] +                          : CheckNames[CK_Unterminated], +                      "Leaked va_list", categories::MemoryError));        BT_leakedvalist->setSuppressOnSink(true);      } @@ -375,7 +379,7 @@ void ValistChecker::checkVAListEndCall(const CallEvent &Call,  std::shared_ptr<PathDiagnosticPiece> ValistChecker::ValistBugVisitor::VisitNode(      const ExplodedNode *N, const ExplodedNode *PrevN, BugReporterContext &BRC, -    BugReport &BR) { +    BugReport &) {    ProgramStateRef State = N->getState();    ProgramStateRef StatePrev = PrevN->getState();  | 
