On 09/17/2011 09:44 AM, Fabien Chêne wrote:
I tried various things without success, and I ended up hacking
supplement_binding_1 to handle those ENUMERAL_TYPEs.
I am all ear for another solution ...

Your solution seems reasonable to me, but it needs a comment, along the lines of

/* We allow pushing an enum multiple times in a class template in order to handle late matching of underlying type on an opaque-enum-declaration followed by an enum-specifier. */

And I guess limit it to dependent class scope. Incidentally, repeating opaque-enum-declarations at class scope is invalid under 9.2/1:

--
A member shall not be declared twice in the member-specification, except that a nested class or member class template can be declared and then later defined, and except that an enumeration can be introduced with an opaque-enum-declaration and later redeclared with an enum-specifier.
--

So

struct A
{
  enum E: int;
  enum E: int { e1 };
};

is OK, but

struct B
{
  enum E: int;
  enum E: int;
};

is not.

+static tree
+strip_using_decl (tree decl)

Needs a comment. Also, this function has a loop in it, but various other places in the patch that look through USING_DECLs don't loop.

          if (!DECL_DEPENDENT_P (field))
-           continue;
+           {
+             tree using_decl = USING_DECL_DECLS (field);
+             if ((TREE_CODE (using_decl) == FIELD_DECL
+                  || TREE_CODE (using_decl) == TYPE_DECL)
+                 && DECL_NAME (using_decl) == name)
+               return using_decl;
+             continue;
+           }

This section needs a comment. Why do we look through USING_DECL for these two kinds of member but not others?

Reply via email to