infinite recursion with ada_check_typedef
authorJoel Brobecker <brobecker@gnat.com>
Tue, 23 Nov 2010 01:03:54 +0000 (01:03 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 23 Nov 2010 01:03:54 +0000 (01:03 +0000)
When trying to resolve an incomplete type, if there is no complete
version of that type available, GDB can go in an infinite loop.

This is because ada_check_typedef makes a recursive call to itself,
in an attempt to make sure that the returned type is never a typedef.
However, when no complete type is found, the current logic causes us
to keep going indefinitely through the same path...

This patch fixes the problem by performing the recursive call to
ada_check_typedef only when a TYPE_CODE_TYPDEF layer needs to be
stripped.

gdb/ChangeLog:

        * ada-lang.c (ada_check_typedef): Call ada_check_typedef only
        if type1 is a typedef.

gdb/ChangeLog
gdb/ada-lang.c

index 18de38966254adcebf5275ce08d31864abb66509..15ed81bb52c0842a43480e2ece182a7783243225 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-22  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_check_typedef): Call ada_check_typedef only
+       if type1 is a typedef.
+
 2010-11-22  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.h (ADA_KNOWN_AUXILIARY_FUNCTION_NAME_PATTERNS): Add
index 76b20e747fcebbb57fd15bec6937a851d4a6b567..15c96b72531cbca3492ad744a2b6878c347d870c 100644 (file)
@@ -7756,10 +7756,12 @@ ada_check_typedef (struct type *type)
 
       /* TYPE1 might itself be a TYPE_CODE_TYPEDEF (this can happen with
         stubs pointing to arrays, as we don't create symbols for array
-        types, only for the typedef-to-array types).  This is why
-        we process TYPE1 with ada_check_typedef before returning
-        the result.  */
-      return ada_check_typedef (type1);
+        types, only for the typedef-to-array types).  If that's the case,
+        strip the typedef layer.  */
+      if (TYPE_CODE (type1) == TYPE_CODE_TYPEDEF)
+       type1 = ada_check_typedef (type1);
+
+      return type1;
     }
 }