diff options
author | John McCall <rjmccall@apple.com> | 2010-02-26 08:45:28 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-02-26 08:45:28 +0000 |
commit | 9ba6166f4a78722e7df8ffbd64eb788bfdf2764a (patch) | |
tree | 9190313545ecd2cecefbc77fb7fe5d7d27ad8721 /lib/Parse/ParseExprCXX.cpp | |
parent | dc0a11cf52cf34ffae941255df60a086e44d1a71 (diff) |
Fix an assertion-on-error during tentative constructor parsing by
propagating error conditions out of the various annotate-me-a-snowflake
routines. Generally (but not universally) removes redundant diagnostics
as well as, you know, not crashing on bad code. On the other hand,
I have just signed myself up to fix fiddly parser errors for the next
week. Again.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97221 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseExprCXX.cpp')
-rw-r--r-- | lib/Parse/ParseExprCXX.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index 7998b26f9b..f1e989f4a7 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -55,7 +55,7 @@ using namespace clang; /// member access expression, e.g., the \p T:: in \p p->T::m. /// -/// \returns true if a scope specifier was parsed. +/// \returns true if there was an error parsing a scope specifier bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, Action::TypeTy *ObjectType, bool EnteringContext, @@ -67,7 +67,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, SS.setScopeRep(Tok.getAnnotationValue()); SS.setRange(Tok.getAnnotationRange()); ConsumeToken(); - return true; + return false; } bool HasScopeSpecifier = false; @@ -168,10 +168,10 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, = Actions.ActOnDependentTemplateName(TemplateKWLoc, SS, TemplateName, ObjectType, EnteringContext); if (!Template) - break; + return true; if (AnnotateTemplateIdToken(Template, TNK_Dependent_template_name, &SS, TemplateName, TemplateKWLoc, false)) - break; + return true; continue; } @@ -188,7 +188,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue()); if (CheckForDestructor && GetLookAheadToken(2).is(tok::tilde)) { *MayBePseudoDestructor = true; - return HasScopeSpecifier; + return false; } if (TemplateId->Kind == TNK_Type_template || @@ -258,7 +258,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, !Actions.isNonTypeNestedNameSpecifier(CurScope, SS, Tok.getLocation(), II, ObjectType)) { *MayBePseudoDestructor = true; - return HasScopeSpecifier; + return false; } // We have an identifier followed by a '::'. Lookup this name @@ -303,7 +303,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, ConsumeToken(); if (AnnotateTemplateIdToken(Template, TNK, &SS, TemplateName, SourceLocation(), false)) - break; + return true; continue; } } @@ -319,7 +319,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, if (CheckForDestructor && Tok.is(tok::tilde)) *MayBePseudoDestructor = true; - return HasScopeSpecifier; + return false; } /// ParseCXXIdExpression - Handle id-expression. |