@@ -154,6 +154,7 @@ class TestSimplifyTypedef : public TestFixture {
154
154
TEST_CASE (simplifyTypedefFunction6);
155
155
TEST_CASE (simplifyTypedefFunction7);
156
156
TEST_CASE (simplifyTypedefFunction8);
157
+ TEST_CASE (simplifyTypedefFunction9);
157
158
158
159
TEST_CASE (simplifyTypedefShadow); // #4445 - shadow variable
159
160
}
@@ -3033,6 +3034,92 @@ class TestSimplifyTypedef : public TestFixture {
3033
3034
TODO_ASSERT_EQUALS (" " , " [test.cpp:2]: (debug) Function::addArguments found argument 'int' with varid 0.\n " , errout.str ()); // make sure that there is no internal error
3034
3035
}
3035
3036
3037
+ void simplifyTypedefFunction9 () {
3038
+ {
3039
+ const char code[] = " typedef ::C (::C::* func1)();\n "
3040
+ " typedef ::C (::C::* func2)() const;\n "
3041
+ " typedef ::C (::C::* func3)() volatile;\n "
3042
+ " typedef ::C (::C::* func4)() const volatile;\n "
3043
+ " func1 f1;\n "
3044
+ " func2 f2;\n "
3045
+ " func3 f3;\n "
3046
+ " func4 f4;" ;
3047
+
3048
+ // The expected result..
3049
+ const std::string expected (" :: C ( :: C :: * f1 ) ( ) ; "
3050
+ " :: C ( :: C :: * f2 ) ( ) const ; "
3051
+ " :: C ( :: C :: * f3 ) ( ) ; "
3052
+ " :: C ( :: C :: * f4 ) ( ) const ;" );
3053
+ ASSERT_EQUALS (expected, tok (code));
3054
+
3055
+ checkSimplifyTypedef (code);
3056
+ ASSERT_EQUALS (" " , errout.str ());
3057
+ }
3058
+
3059
+ {
3060
+ const char code[] = " typedef B::C (B::C::* func1)();\n "
3061
+ " typedef B::C (B::C::* func2)() const;\n "
3062
+ " typedef B::C (B::C::* func3)() volatile;\n "
3063
+ " typedef B::C (B::C::* func4)() const volatile;\n "
3064
+ " func1 f1;\n "
3065
+ " func2 f2;\n "
3066
+ " func3 f3;\n "
3067
+ " func4 f4;" ;
3068
+
3069
+ // The expected result..
3070
+ const std::string expected (" B :: C * f1 ; "
3071
+ " B :: C ( B :: C :: * f2 ) ( ) const ; "
3072
+ " B :: C * f3 ; "
3073
+ " B :: C ( B :: C :: * f4 ) ( ) const ;" );
3074
+ ASSERT_EQUALS (expected, tok (code));
3075
+
3076
+ checkSimplifyTypedef (code);
3077
+ ASSERT_EQUALS (" " , errout.str ());
3078
+ }
3079
+
3080
+ {
3081
+ const char code[] = " typedef ::B::C (::B::C::* func1)();\n "
3082
+ " typedef ::B::C (::B::C::* func2)() const;\n "
3083
+ " typedef ::B::C (::B::C::* func3)() volatile;\n "
3084
+ " typedef ::B::C (::B::C::* func4)() const volatile;\n "
3085
+ " func1 f1;\n "
3086
+ " func2 f2;\n "
3087
+ " func3 f3;\n "
3088
+ " func4 f4;" ;
3089
+
3090
+ // The expected result..
3091
+ const std::string expected (" :: B :: C ( :: B :: C :: * f1 ) ( ) ; "
3092
+ " :: B :: C ( :: B :: C :: * f2 ) ( ) const ; "
3093
+ " :: B :: C ( :: B :: C :: * f3 ) ( ) ; "
3094
+ " :: B :: C ( :: B :: C :: * f4 ) ( ) const ;" );
3095
+ ASSERT_EQUALS (expected, tok (code));
3096
+
3097
+ checkSimplifyTypedef (code);
3098
+ ASSERT_EQUALS (" " , errout.str ());
3099
+ }
3100
+
3101
+ {
3102
+ const char code[] = " typedef A::B::C (A::B::C::* func1)();\n "
3103
+ " typedef A::B::C (A::B::C::* func2)() const;\n "
3104
+ " typedef A::B::C (A::B::C::* func3)() volatile;\n "
3105
+ " typedef A::B::C (A::B::C::* func4)() const volatile;\n "
3106
+ " func1 f1;\n "
3107
+ " func2 f2;\n "
3108
+ " func3 f3;\n "
3109
+ " func4 f4;" ;
3110
+
3111
+ // The expected result..
3112
+ const std::string expected (" A :: B :: C * f1 ; "
3113
+ " A :: B :: C ( A :: B :: C :: * f2 ) ( ) const ; "
3114
+ " A :: B :: C * f3 ; "
3115
+ " A :: B :: C ( A :: B :: C :: * f4 ) ( ) const ;" );
3116
+ ASSERT_EQUALS (expected, tok (code));
3117
+
3118
+ checkSimplifyTypedef (code);
3119
+ ASSERT_EQUALS (" " , errout.str ());
3120
+ }
3121
+ }
3122
+
3036
3123
void simplifyTypedefShadow () { // shadow variable (#4445)
3037
3124
const char code[] = " typedef struct { int x; } xyz;;\n "
3038
3125
" void f(){\n "
0 commit comments