@@ -154,6 +154,7 @@ class TestSimplifyTypedef : public TestFixture {
154154 TEST_CASE (simplifyTypedefFunction6);
155155 TEST_CASE (simplifyTypedefFunction7);
156156 TEST_CASE (simplifyTypedefFunction8);
157+ TEST_CASE (simplifyTypedefFunction9);
157158
158159 TEST_CASE (simplifyTypedefShadow); // #4445 - shadow variable
159160 }
@@ -3033,6 +3034,92 @@ class TestSimplifyTypedef : public TestFixture {
30333034 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
30343035 }
30353036
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+
30363123 void simplifyTypedefShadow () { // shadow variable (#4445)
30373124 const char code[] = " typedef struct { int x; } xyz;;\n "
30383125 " void f(){\n "
0 commit comments