[cfe-commits] r106993 - in /cfe/trunk: include/clang/Parse/Action.h lib/Parse/ParseDeclCXX.cpp lib/Sema/Sema.cpp lib/Sema/Sema.h lib/Sema/SemaAccess.cpp test/CXX/temp/temp.spec/temp.explicit/p11.cpp
Chandler Carruth
chandlerc at gmail.com
Tue Jun 29 11:01:29 PDT 2010
On Tue, Jun 29, 2010 at 8:13 AM, Douglas Gregor <dgregor at apple.com> wrote:
>
> On Jun 28, 2010, at 1:39 AM, Chandler Carruth wrote:
>
> > Author: chandlerc
> > Date: Mon Jun 28 03:39:25 2010
> > New Revision: 106993
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=106993&view=rev
> > Log:
> > Partial fix for PR7267 based on comments by John McCall on an earlier
> patch.
> > This is more targeted, as it simply provides toggle actions for the
> parser to
> > turn access checking on and off. We then use these to suppress access
> checking
> > only while we parse the template-id (included scope specifier) of an
> explicit
> > instantiation and explicit specialization of a class template. The
> > specialization behavior is an extension, as it seems likely a defect that
> the
> > standard did not exempt them as it does explicit instantiations.
>
> Both EDG and g++ seem to allow this "extension", too.
>
> > Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=106993&r1=106992&r2=106993&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
> > +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Mon Jun 28 03:39:25 2010
> > @@ -613,6 +613,20 @@
> > ConsumeCodeCompletionToken();
> > }
> >
> > + // C++03 [temp.explicit] 14.7.2/8:
> > + // The usual access checking rules do not apply to names used to
> specify
> > + // explicit instantiations.
> > + //
> > + // As an extension we do not perform access checking on the names used
> to
> > + // specify explicit specializations either. This is important to allow
> > + // specializing traits classes for private types.
> > + bool SuppressingAccessChecks = false;
> > + if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation ||
> > + TemplateInfo.Kind == ParsedTemplateInfo::ExplicitSpecialization) {
> > + Actions.ActOnStartSuppressingAccessChecks();
> > + SuppressingAccessChecks = true;
> > + }
> > +
> > AttributeList *AttrList = 0;
> > // If attributes exist after tag, parse them.
> > if (Tok.is(tok::kw___attribute))
> > @@ -732,10 +746,18 @@
> > DS.SetTypeSpecError();
> > SkipUntil(tok::semi, false, true);
> > TemplateId->Destroy();
> > + if (SuppressingAccessChecks)
> > + Actions.ActOnStopSuppressingAccessChecks();
> > +
> > return;
> > }
> > }
> >
> > + // As soon as we're finished parsing the class's template-id, turn
> access
> > + // checking back on.
> > + if (SuppressingAccessChecks)
> > + Actions.ActOnStopSuppressingAccessChecks();
> > +
> > // There are four options here. If we have 'struct foo;', then this
> > // is either a forward declaration or a friend declaration, which
> > // have to be treated differently. If we have 'struct foo {...' or
>
> I'd feel a bit more comfortable if this were an RAII object.
>
As would I, but John seemed to think that was overkill in his email about
the original patch... maybe I was mis-interpreting him though? I'm happy to
switch if you like.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20100629/1a4d7a1b/attachment.html>
More information about the cfe-commits
mailing list