summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-10-04 01:57:39 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-10-04 01:57:39 +0000
commita9d100178c00306bf0f9ba4df5e80298248fdfe8 (patch)
tree83606f70e8a0a6e6876fe6883de4c3ed732881ec
parent7e26a67ffa5da8e8db5ab2a8862060943ca5e17b (diff)
downloadbcm5719-llvm-a9d100178c00306bf0f9ba4df5e80298248fdfe8.tar.gz
bcm5719-llvm-a9d100178c00306bf0f9ba4df5e80298248fdfe8.zip
PR20991: ::decltype is not valid.
llvm-svn: 219043
-rw-r--r--clang/lib/Parse/ParseExprCXX.cpp3
-rw-r--r--clang/test/Parser/cxx0x-decl.cpp5
2 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp
index 8f22f5609e6..47fdd826a5d 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -242,7 +242,8 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
*MayBePseudoDestructor = false;
}
- if (Tok.is(tok::kw_decltype) || Tok.is(tok::annot_decltype)) {
+ if (!HasScopeSpecifier &&
+ (Tok.is(tok::kw_decltype) || Tok.is(tok::annot_decltype))) {
DeclSpec DS(AttrFactory);
SourceLocation DeclLoc = Tok.getLocation();
SourceLocation EndLoc = ParseDecltypeSpecifier(DS);
diff --git a/clang/test/Parser/cxx0x-decl.cpp b/clang/test/Parser/cxx0x-decl.cpp
index 2cd68252133..994104fc9df 100644
--- a/clang/test/Parser/cxx0x-decl.cpp
+++ b/clang/test/Parser/cxx0x-decl.cpp
@@ -116,6 +116,11 @@ namespace DuplicateSpecifier {
};
}
+namespace ColonColonDecltype {
+ struct S { struct T {}; };
+ ::decltype(S())::T invalid; // expected-error {{expected unqualified-id}}
+}
+
struct Base { virtual void f() = 0; virtual void g() = 0; virtual void h() = 0; };
struct MemberComponentOrder : Base {
void f() override __asm__("foobar") __attribute__(( )) {}
OpenPOWER on IntegriCloud