]> granicus.if.org Git - clang/commitdiff
Fix invalid test generation by utils/ABITest/ABITestGen.py when the same enum is...
authorDaniel Sanders <daniel.sanders@imgtec.com>
Thu, 21 Aug 2014 10:13:49 +0000 (10:13 +0000)
committerDaniel Sanders <daniel.sanders@imgtec.com>
Thu, 21 Aug 2014 10:13:49 +0000 (10:13 +0000)
When generating records/unions, the same enum type may be generated more
than once (with different names). In these cases, the name of the enum
values are not sufficiently unique to prevent multiple declarations. E.g:
  typedef enum T3 { enum0val0 } T3;
  typedef T3 T2[3];
  typedef enum T4 { enum0val0 } T4;
  typedef union T1 { T2 field0; T4 field1; char field2; } T1;

Added a unique suffix to enum values so that multiple identical enum types do
not use the same enum value names.

One example of this bug is produced by:
  ABITestGen.py --no-unsigned --no-vector --no-complex --no-bool \
                --max-args 0 --max-record-depth 1 -o inputs/test.9921.a.c \
                -T inputs/test.9921.b.c -D inputs/test.9921.driver.c \
                --min=9921 --count=1

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216166 91177308-0d34-0410-b5e6-96231b3b80d8

utils/ABITest/ABITestGen.py
utils/ABITest/TypeGen.py

index 4855f4893c9dc3e2fe41b175ed6a5ff09f619398..27cc5ec2582396eef245d732c6f3eff476eb4d2c 100755 (executable)
@@ -214,7 +214,7 @@ class TypePrinter:
                 yield '(%s) 1'%(t.name,)
         elif isinstance(t, EnumType):
             for i in range(0, len(t.enumerators)):
-                yield 'enum%dval%d' % (t.index, i)
+                yield 'enum%dval%d_%d' % (t.index, i, t.unique_id)
         elif isinstance(t, RecordType):
             nonPadding = [f for f in t.fields 
                           if not f.isPaddingBitField()]
index 7a99d628cd2eb6d7512b3a5c5426c2976e163897..1e4471c71e57c8ae7fb505c87d89220f4a842e86 100644 (file)
@@ -56,16 +56,20 @@ class BuiltinType(Type):
         return self.name
 
 class EnumType(Type):
+    unique_id = 0
+
     def __init__(self, index, enumerators):
         self.index = index
         self.enumerators = enumerators
+        self.unique_id = self.__class__.unique_id
+        self.__class__.unique_id += 1
 
     def getEnumerators(self):
         result = ''
         for i, init in enumerate(self.enumerators):
             if i > 0:
                 result = result + ', '
-            result = result + 'enum%dval%d' % (self.index, i)
+            result = result + 'enum%dval%d_%d' % (self.index, i, self.unique_id)
             if init:
                 result = result + ' = %s' % (init)