[PATCH] Put types defined in prototype into translation unit context

Richard Smith richard at metafoo.co.uk
Thu May 29 20:15:42 PDT 2014


I think this is the wrong place for this fix; can we check for types being defined in a parameter type sooner, and mark the type invalid in that case? (The assertion will be suppressed for an invalid type.)

We also assert on this test case, for a reason that looks closely related:

  struct pr19018 {
    short foo6 (struct bar0 {} bar3); // expected-error{{cannot be defined in a parameter type}}
    bar0 *p;
  };

... and I'd really like us to fix this more thoroughly, for all relevant cases.

================
Comment at: lib/Sema/SemaDecl.cpp:10743-10748
@@ -10743,6 +10742,8 @@
+  }
+  if (S->isFunctionPrototypeScope() && TUK == TUK_Definition) {
     // If this is an enum declaration in function prototype scope, set its
     // initial context to the translation unit.
     // FIXME: [citation needed]
     SearchDC = Context.getTranslationUnitDecl();
   }
 
----------------
This looks wrong in C. Given:

  void f(enum E { e } *p);

... the enum definition should not be visible outside the function.

http://reviews.llvm.org/D3925






More information about the cfe-commits mailing list