================ @@ -30,20 +30,35 @@ void ImplementationInNamespaceCheck::check( const auto *MatchedDecl = Result.Nodes.getNodeAs<Decl>("child_of_translation_unit"); const auto *NS = dyn_cast<NamespaceDecl>(MatchedDecl); + + // LLVM libc declarations should be inside of a non-anonymous namespace. if (NS == nullptr || NS->isAnonymousNamespace()) { diag(MatchedDecl->getLocation(), "declaration must be enclosed within the '%0' namespace") - << RequiredNamespaceMacroName; + << RequiredNamespaceDeclMacroName; return; } + + // Enforce that the namespace is the result of macro expansion if (Result.SourceManager->isMacroBodyExpansion(NS->getLocation()) == false) { diag(NS->getLocation(), "the outermost namespace should be the '%0' macro") - << RequiredNamespaceMacroName; + << RequiredNamespaceDeclMacroName; return; } - if (NS->getName().starts_with(RequiredNamespaceStart) == false) { + + // We want the macro to have [[gnu::visibility("hidden")]] as a prefix, but + // visibility is just an attribute in the AST construct, so we check that + // instead. + if (NS->getVisibility() != Visibility::HiddenVisibility) { diag(NS->getLocation(), "the '%0' macro should start with '%1'") - << RequiredNamespaceMacroName << RequiredNamespaceStart; + << RequiredNamespaceDeclMacroName << RequiredNamespaceDeclStart; + return; + } + + // Lastly, make sure the namespace name actually has the __llvm_libc prefix + if (NS->getName().starts_with(RequiredNamespaceRefStart) == false) { ---------------- ilovepi wrote:
Oh, good catch! Let me update this. https://github.com/llvm/llvm-project/pull/98424 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits