]> granicus.if.org Git - clang/commit
Don't crash on `struct ::, struct ::` (and the same for enums).
authorNico Weber <nicolasweber@gmx.de>
Sun, 15 Feb 2015 07:26:13 +0000 (07:26 +0000)
committerNico Weber <nicolasweber@gmx.de>
Sun, 15 Feb 2015 07:26:13 +0000 (07:26 +0000)
commitaad6cdd1bc865e81c0187a43e56cfe8cb555e7a5
tree9b05d24ec934f9288a05b5190bcfec2e083f0b0d
parent7506fe5f8ff8af2e83e32396161d79322115a023
Don't crash on `struct ::, struct ::` (and the same for enums).

The first part of that line doesn't parse correctly and ParseClassSpecifier() for
some reason skips to tok::comma to recover, and then
ParseDeclarationSpecifiers() sees the next struct and calls
ParseClassSpecifier() again with the same DeclSpec object.

However, the first call already called ActOnCXXGlobalScopeSpecifier() on the
DeclSpec's CXXScopeSpec, and sema gets confused when this gets called again.

As a fix, let ParseClassSpecifier() (and ParseEnumSpecifier()) call
ParseOptionalCXXScopeSpec() with a temporary CXXScopeSpec object, and only
copy it into the DeclSpec if things work out.  (This is also how all the other
functions that set the DeclSpec's TypeSpecScope set it.)

Found by SLi's bot.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229288 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Parse/ParseDecl.cpp
lib/Parse/ParseDeclCXX.cpp
test/Parser/recovery.cpp