[Libreoffice-commits] core.git: compilerplugins/clang

Stephan Bergmann (via logerrit) logerrit at kemper.freedesktop.org
Fri Nov 15 17:27:52 UTC 2019


 compilerplugins/clang/external.cxx |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

New commits:
commit f213092d5a0b784df1b12ae62b7c5dcfb7d27280
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Fri Nov 15 14:41:26 2019 +0100
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Fri Nov 15 18:26:25 2019 +0100

    loplugin:external: Extend comment about the perils of moving a function
    
    ...into an unnamed namespace.  (And make it into a "leading comment" that
    precedes the code it appeartains to.  It had orignally been meant as a "trailing
    comment" that follows the code it appeartains to, and had been idented further
    to indicate that, but clang-format unhelpfully breaks such indentation of
    trailing comments that need to be preceded by a line break due to line length
    limitations.)
    
    Change-Id: I6a71a6b8e11ba641acfb542142fe14b4b6445f51
    Reviewed-on: https://gerrit.libreoffice.org/82792
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/compilerplugins/clang/external.cxx b/compilerplugins/clang/external.cxx
index 442d174bd15b..3248df5db078 100644
--- a/compilerplugins/clang/external.cxx
+++ b/compilerplugins/clang/external.cxx
@@ -282,9 +282,38 @@ private:
             canStatic = isa<FunctionDecl>(decl) || isa<VarDecl>(decl)
                         || isa<FunctionTemplateDecl>(decl) || isa<VarTemplateDecl>(decl);
         }
+        // In general, moving functions into an unnamed namespace can: break ADL like in
+        //
+        //   struct S1 { int f() { return 1; } };
+        //   int f(S1 s) { return s.f(); }
+        //   namespace N {
+        //     struct S2: S1 { int f() { return 0; } };
+        //     int f(S2 s) { return s.f(); } // [*]
+        //   }
+        //   int main() { return f(N::S2()); }
+        //
+        // changing from returning 0 to returning 1 when [*] is moved into an unnamed namespace; can
+        // conflict with function declarations in the moved function like in
+        //
+        //   int f(int) { return 0; }
+        //   namespace { int f(int) { return 1; } }
+        //   int g() { // [*]
+        //     int f(int);
+        //     return f(0);
+        //   }
+        //   int main() { return g(); }
+        //
+        // changing from returning 0 to returning 1 when [*] is moved into an unnamed namespace; and
+        // can conflict with overload resolution in general like in
+        //
+        //   int f(int) { return 0; }
+        //   namespace { int f(...) { return 1; } }
+        //   int g() { return f(0); } // [*]
+        //   int main() { return g(); }
+        //
+        // changing from returning 0 to returning 1 when [*] is moved into an unnamed namespace:
         auto const canUnnamed = compiler.getLangOpts().CPlusPlus
                                 && !(isa<FunctionDecl>(decl) || isa<FunctionTemplateDecl>(decl));
-        // in general, moving functions into an unnamed namespace can break ADL
         assert(canStatic || canUnnamed);
         report(
             DiagnosticsEngine::Warning,


More information about the Libreoffice-commits mailing list