llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-format

Author: Ben Dunkin (bdunkin)

<details>
<summary>Changes</summary>

This fixes the `SpaceBeforeParensOptions.AfterFunctionDeclarationName` and 
`SpaceBeforeParensOptions.AfterFunctionDefinitionName` options not adding 
spaces when the function has an explicit Microsoft calling convention.

Attribution Note - I have been authorized to contribute this change on behalf 
of my company: ArenaNet LLC

---
Full diff: https://github.com/llvm/llvm-project/pull/143047.diff


3 Files Affected:

- (modified) clang/lib/Format/FormatToken.h (+1) 
- (modified) clang/lib/Format/TokenAnnotator.cpp (+15) 
- (modified) clang/unittests/Format/FormatTest.cpp (+12) 


``````````diff
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h
index 94014aee3221f..ef1c129b29b0c 100644
--- a/clang/lib/Format/FormatToken.h
+++ b/clang/lib/Format/FormatToken.h
@@ -114,6 +114,7 @@ namespace format {
   TYPE(LineComment)                                                            
\
   TYPE(MacroBlockBegin)                                                        
\
   TYPE(MacroBlockEnd)                                                          
\
+  TYPE(MicrosoftCallingConvention)                                             
\
   TYPE(ModulePartitionColon)                                                   
\
   TYPE(NamespaceLBrace)                                                        
\
   TYPE(NamespaceMacro)                                                         
\
diff --git a/clang/lib/Format/TokenAnnotator.cpp 
b/clang/lib/Format/TokenAnnotator.cpp
index da279d07b5918..4e23478058499 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -1802,6 +1802,14 @@ class AnnotatingParser {
       if (Style.isTableGen() && !parseTableGenValue())
         return false;
       break;
+    case tok::kw___cdecl:
+    case tok::kw___stdcall:
+    case tok::kw___fastcall:
+    case tok::kw___thiscall:
+    case tok::kw___regcall:
+    case tok::kw___vectorcall:
+      Tok->setType(TT_MicrosoftCallingConvention);
+      break;
     default:
       break;
     }
@@ -2611,6 +2619,13 @@ class AnnotatingParser {
     // Skip "const" as it does not have an influence on whether this is a name.
     FormatToken *PreviousNotConst = Tok.getPreviousNonComment();
 
+    // Skip Microsoft calling conventions, as they come before the function
+    // name, but after the return type
+    while (PreviousNotConst &&
+           PreviousNotConst->is(TT_MicrosoftCallingConvention)) {
+      PreviousNotConst = PreviousNotConst->getPreviousNonComment();
+    }
+
     // For javascript const can be like "let" or "var"
     if (!Style.isJavaScript())
       while (PreviousNotConst && PreviousNotConst->is(tok::kw_const))
diff --git a/clang/unittests/Format/FormatTest.cpp 
b/clang/unittests/Format/FormatTest.cpp
index c0633ba3c29b3..0f96b0f92cdb2 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -17504,6 +17504,12 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
   verifyFormat("A::A() : a(1) {}", SpaceFuncDecl);
   verifyFormat("void f () __attribute__((asdf));", SpaceFuncDecl);
   verifyFormat("void __attribute__((asdf)) f ();", SpaceFuncDecl);
+  verifyFormat("void __stdcall f ();", SpaceFuncDecl);
+  verifyFormat("void __cdecl f ();", SpaceFuncDecl);
+  verifyFormat("void __fastcall f ();", SpaceFuncDecl);
+  verifyFormat("void __stdcall f() {}", SpaceFuncDecl);
+  verifyFormat("void __cdecl f() {}", SpaceFuncDecl);
+  verifyFormat("void __fastcall f() {}", SpaceFuncDecl);
   verifyFormat("#define A(x) x", SpaceFuncDecl);
   verifyFormat("#define A (x) x", SpaceFuncDecl);
   verifyFormat("#if defined(x)\n"
@@ -17540,6 +17546,12 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
   verifyFormat("A::A () : a(1) {}", SpaceFuncDef);
   verifyFormat("void f() __attribute__((asdf));", SpaceFuncDef);
   verifyFormat("void __attribute__((asdf)) f();", SpaceFuncDef);
+  verifyFormat("void __stdcall f();", SpaceFuncDef);
+  verifyFormat("void __cdecl f();", SpaceFuncDef);
+  verifyFormat("void __fastcall f();", SpaceFuncDef);
+  verifyFormat("void __stdcall f () {}", SpaceFuncDef);
+  verifyFormat("void __cdecl f () {}", SpaceFuncDef);
+  verifyFormat("void __fastcall f () {}", SpaceFuncDef);
   verifyFormat("#define A(x) x", SpaceFuncDef);
   verifyFormat("#define A (x) x", SpaceFuncDef);
   verifyFormat("#if defined(x)\n"

``````````

</details>


https://github.com/llvm/llvm-project/pull/143047
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to