[cfe-commits] r155935 - in /cfe/trunk/lib/Sema: SemaCXXScopeSpec.cpp SemaTemplate.cpp

Matt Beaumont-Gay matthewbg at google.com
Tue May 1 13:31:51 PDT 2012


Testcase?

On Tue, May 1, 2012 at 1:23 PM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Tue May  1 15:23:02 2012
> New Revision: 155935
>
> URL: http://llvm.org/viewvc/llvm-project?rev=155935&view=rev
> Log:
> In C++11 mode, implement the C++11 semantics for
> [basic.lookup.classref]p1 and p4, which concerns name lookup for
> nested-name-specifiers and template names, respectively, in a member
> access expression. C++98/03 forces us to look both in the scope of the
> object and in the current scope, then compare the results. C++11 just
> takes the result from the scope of the object, if something is
> found. Fixes <rdar://problem/11328502>.
>
> Modified:
>    cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp
>    cfe/trunk/lib/Sema/SemaTemplate.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp?rev=155935&r1=155934&r2=155935&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp Tue May  1 15:23:02 2012
> @@ -539,8 +539,9 @@
>
>   NamedDecl *SD = Found.getAsSingle<NamedDecl>();
>   if (isAcceptableNestedNameSpecifier(SD)) {
> -    if (!ObjectType.isNull() && !ObjectTypeSearchedInScope) {
> -      // C++ [basic.lookup.classref]p4:
> +    if (!ObjectType.isNull() && !ObjectTypeSearchedInScope &&
> +        !getLangOpts().CPlusPlus0x) {
> +      // C++03 [basic.lookup.classref]p4:
>       //   [...] If the name is found in both contexts, the
>       //   class-name-or-namespace-name shall refer to the same entity.
>       //
> @@ -548,6 +549,8 @@
>       // into the current scope (the scope of the postfix-expression) to
>       // see if we can find the same name there. As above, if there is no
>       // scope, reconstruct the result from the template instantiation itself.
> +      //
> +      // Note that C++11 does *not* perform this redundant lookup.
>       NamedDecl *OuterDecl;
>       if (S) {
>         LookupResult FoundOuter(*this, &Identifier, IdentifierLoc,
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=155935&r1=155934&r2=155935&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Tue May  1 15:23:02 2012
> @@ -354,12 +354,14 @@
>     return;
>   }
>
> -  if (S && !ObjectType.isNull() && !ObjectTypeSearchedInScope) {
> -    // C++ [basic.lookup.classref]p1:
> +  if (S && !ObjectType.isNull() && !ObjectTypeSearchedInScope &&
> +      !(getLangOpts().CPlusPlus0x && !Found.empty())) {
> +    // C++03 [basic.lookup.classref]p1:
>     //   [...] If the lookup in the class of the object expression finds a
>     //   template, the name is also looked up in the context of the entire
>     //   postfix-expression and [...]
>     //
> +    // Note: C++11 does not perform this second lookup.
>     LookupResult FoundOuter(*this, Found.getLookupName(), Found.getNameLoc(),
>                             LookupOrdinaryName);
>     LookupName(FoundOuter, S);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list