diff options
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/SemaCXX/cxx1y-deduced-return-type.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/clang/test/SemaCXX/cxx1y-deduced-return-type.cpp b/clang/test/SemaCXX/cxx1y-deduced-return-type.cpp index a061cf4ddb7..2592e7cf105 100644 --- a/clang/test/SemaCXX/cxx1y-deduced-return-type.cpp +++ b/clang/test/SemaCXX/cxx1y-deduced-return-type.cpp @@ -385,16 +385,31 @@ namespace MemberTemplatesWithDeduction { } } -namespace NNS { - int n; - decltype(auto) i(); - decltype(n) j(); - struct X { - // We resolve a wording bug here: 'decltype(auto)::' should not be parsed - // as a nested-name-specifier. - friend decltype(auto) ::NNS::i(); - friend decltype(n) ::NNS::j(); // expected-error {{not a class}} - }; +// We resolve a wording bug here: 'decltype(auto)' should not be modeled as a +// decltype-specifier, just as a simple-type-specifier. All the extra places +// where a decltype-specifier can appear make no sense for 'decltype(auto)'. +namespace DecltypeAutoShouldNotBeADecltypeSpecifier { + namespace NNS { + int n; + decltype(auto) i(); + decltype(n) j(); + struct X { + friend decltype(auto) ::DecltypeAutoShouldNotBeADecltypeSpecifier::NNS::i(); + friend decltype(n) ::DecltypeAutoShouldNotBeADecltypeSpecifier::NNS::j(); // expected-error {{not a class}} + }; + } + + namespace Dtor { + struct A {}; + void f(A a) { a.~decltype(auto)(); } // expected-error {{'decltype(auto)' not allowed here}} + } + + namespace BaseClass { + struct A : decltype(auto) {}; // expected-error {{'decltype(auto)' not allowed here}} + struct B { + B() : decltype(auto)() {} // expected-error {{'decltype(auto)' not allowed here}} + }; + } } namespace CurrentInstantiation { |

