summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/src/flag_decltype.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.75.0/src/flag_decltype.cpp')
-rw-r--r--debian/uncrustify-trinity/uncrustify-trinity-0.75.0/src/flag_decltype.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/src/flag_decltype.cpp b/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/src/flag_decltype.cpp
new file mode 100644
index 00000000..a3036f81
--- /dev/null
+++ b/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/src/flag_decltype.cpp
@@ -0,0 +1,46 @@
+/**
+ * @file flag_decltype.cpp
+ *
+ * @license GPL v2+
+ */
+
+#include "chunk.h"
+
+
+bool flag_cpp_decltype(Chunk *pc)
+{
+ LOG_FUNC_ENTRY();
+
+ if (chunk_is_token(pc, CT_DECLTYPE))
+ {
+ auto paren_open = pc->GetNextNcNnl();
+
+ if (chunk_is_token(paren_open, CT_PAREN_OPEN))
+ {
+ // We would like to simply call chunk_skip_to_match(), but it finds
+ // a match based on level, and the level is 0 for all chunks in some
+ // cases, like the following example.
+ //
+ // template <typename T>
+ // decltype(std::declval<T &>().put(foo), std::true_type())
+ // has_something(Tag<2>);
+ //
+ // This means that IN_DECLTYPE is only set for tokens through the
+ // closing parenthesis right before ".put" in the above example.
+ //
+ // So, we will manually look for the matching closing parenthesis.
+ chunk_flags_set(paren_open, PCF_IN_DECLTYPE);
+ pc = paren_open->GetNextNcNnl();
+
+ for (int level = 1; pc->IsNotNullChunk() && level > 0; pc = pc->GetNextNcNnl())
+ {
+ level += chunk_is_token(pc, CT_PAREN_OPEN);
+ level -= chunk_is_token(pc, CT_PAREN_CLOSE);
+ chunk_flags_set(pc, PCF_IN_DECLTYPE);
+ }
+
+ return(pc->IsNotNullChunk());
+ }
+ }
+ return(false);
+} // mark_cpp_decltype