diff options
author | Reid Kleckner <rnk@google.com> | 2015-10-20 18:12:08 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2015-10-20 18:12:08 +0000 |
commit | 077fe12e5dfe942ec565383c46434476eb31e62c (patch) | |
tree | b332cc461eee964ce6bb1c8091fecbe201133ecf /clang/test/SemaCXX/using-decl-1.cpp | |
parent | 32064024b93d7d0b5225ac576b7684f604c352bf (diff) | |
download | bcm5719-llvm-077fe12e5dfe942ec565383c46434476eb31e62c.tar.gz bcm5719-llvm-077fe12e5dfe942ec565383c46434476eb31e62c.zip |
Look through using decls when classifying implicit member access
Clang will now accept this valid C++11 code:
struct A { int field; };
struct B : A {
using A::field;
enum { TheSize = sizeof(field) };
};
Previously we would classify the 'field' reference as something other
than a field, and then forget to apply the C++11 rule to allow
non-static data member references in unevaluated contexts.
This usually arises in class templates that want to reference fields of
a dependent base in an unevaluated context outside of an instance
method. Such contexts do not allow references to 'this', so the only way
to access the field is with a using decl and an implicit member
reference.
llvm-svn: 250839
Diffstat (limited to 'clang/test/SemaCXX/using-decl-1.cpp')
-rw-r--r-- | clang/test/SemaCXX/using-decl-1.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/using-decl-1.cpp b/clang/test/SemaCXX/using-decl-1.cpp index ca532692c1c..5afd15f8b50 100644 --- a/clang/test/SemaCXX/using-decl-1.cpp +++ b/clang/test/SemaCXX/using-decl-1.cpp @@ -327,3 +327,16 @@ namespace PR24033 { using PR24033::st; // expected-error {{target of using declaration conflicts with declaration already in scope}} } } + +namespace field_use { +struct A { int field; }; +struct B : A { + // Previously Clang rejected this valid C++11 code because it didn't look + // through the UsingShadowDecl. + using A::field; +#if __cplusplus < 201103L + // expected-error@+2 {{invalid use of non-static data member 'field'}} +#endif + enum { X = sizeof(field) }; +}; +} |