tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TrivialCtorDtorChecker.cpp (1229B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include "TrivialCtorDtorChecker.h"
      6 #include "CustomMatchers.h"
      7 
      8 void TrivialCtorDtorChecker::registerMatchers(MatchFinder *AstMatcher) {
      9  AstMatcher->addMatcher(cxxRecordDecl(hasTrivialCtorDtor()).bind("node"),
     10                         this);
     11 }
     12 
     13 void TrivialCtorDtorChecker::check(const MatchFinder::MatchResult &Result) {
     14  const char *Error = "class %0 must have trivial constructors and destructors";
     15  const CXXRecordDecl *Node = Result.Nodes.getNodeAs<CXXRecordDecl>("node");
     16 
     17  if (!Node->hasDefinition()) {
     18    return;
     19  }
     20 
     21  // We need to accept non-constexpr trivial constructors as well. This occurs
     22  // when a struct contains pod members, which will not be initialized. As
     23  // constexpr values are initialized, the constructor is non-constexpr.
     24  bool BadCtor = !(Node->hasConstexprDefaultConstructor() ||
     25                   Node->hasTrivialDefaultConstructor());
     26  bool BadDtor = !Node->hasTrivialDestructor();
     27  if (BadCtor || BadDtor)
     28    diag(Node->getBeginLoc(), Error, DiagnosticIDs::Error) << Node;
     29 }