r188510 - Fix for dependent contexts in alias templates.
Eli Friedman
eli.friedman at gmail.com
Thu Aug 15 17:29:22 PDT 2013
On Thu, Aug 15, 2013 at 4:59 PM, Eli Friedman <eli.friedman at gmail.com>wrote:
> Author: efriedma
> Date: Thu Aug 15 18:59:20 2013
> New Revision: 188510
>
> URL: http://llvm.org/viewvc/llvm-project?rev=188510&view=rev
> Log:
> Fix for dependent contexts in alias templates.
>
> When we are parsing a type for an alias template, we are not entering
> the context, so we can't look into dependent classes. Make sure the
> parser handles this correctly.
>
> PR16904.
>
> Modified:
> cfe/trunk/lib/Parse/ParseDecl.cpp
> cfe/trunk/test/SemaTemplate/alias-templates.cpp
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=188510&r1=188509&r2=188510&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Thu Aug 15 18:59:20 2013
> @@ -2436,7 +2436,7 @@ void Parser::ParseDeclarationSpecifiers(
>
> case tok::coloncolon: // ::foo::bar
> // C++ scope specifier. Annotate and loop, or bail out on error.
> - if (TryAnnotateCXXScopeToken(true)) {
> + if (TryAnnotateCXXScopeToken(EnteringContext)) {
> if (!DS.hasTypeSpecifier())
> DS.SetTypeSpecError();
> goto DoneWithDeclSpec;
> @@ -2632,7 +2632,7 @@ void Parser::ParseDeclarationSpecifiers(
> // In C++, check to see if this is a scope specifier like
> foo::bar::, if
> // so handle it as such. This is important for ctor parsing.
> if (getLangOpts().CPlusPlus) {
> - if (TryAnnotateCXXScopeToken(true)) {
> + if (TryAnnotateCXXScopeToken(EnteringContext)) {
> if (!DS.hasTypeSpecifier())
> DS.SetTypeSpecError();
> goto DoneWithDeclSpec;
>
>
Ugh... I just spent some more time thinking about this; while this fix
doesn't break anything as far as I know, it isn't really complete.
Consider the following testcase:
template <typename,typename>
struct base {
template <typename> struct derived;
};
template <typename T, typename U, typename V> base<T, U>::derived<V> foo();
There's a missing typename keyword, but clang fails to detect this. Any
suggestions?
-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130815/3bd7ab3e/attachment.html>
More information about the cfe-commits
mailing list