aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ApiExtractor/parser/lexer.cpp13
-rw-r--r--ApiExtractor/parser/parser.cpp9
-rw-r--r--ApiExtractor/parser/parser.h1
-rw-r--r--ApiExtractor/parser/tokens.cpp1
-rw-r--r--ApiExtractor/parser/tokens.h1
-rw-r--r--tests/libsample/photon.h32
6 files changed, 57 insertions, 0 deletions
diff --git a/ApiExtractor/parser/lexer.cpp b/ApiExtractor/parser/lexer.cpp
index 0d1269e29..eff54b7f7 100644
--- a/ApiExtractor/parser/lexer.cpp
+++ b/ApiExtractor/parser/lexer.cpp
@@ -1387,6 +1387,19 @@ void Lexer::scanKeyword8()
}
break;
+ case 'n':
+ if (*(cursor + 1) == 'o' &&
+ *(cursor + 2) == 'e' &&
+ *(cursor + 3) == 'x' &&
+ *(cursor + 4) == 'c' &&
+ *(cursor + 5) == 'e' &&
+ *(cursor + 6) == 'p' &&
+ *(cursor + 7) == 't') {
+ token_stream[(int) index++].kind = Token_noexcept;
+ return;
+ }
+ break;
+
case 'o':
if (*(cursor + 1) == 'p' &&
*(cursor + 2) == 'e' &&
diff --git a/ApiExtractor/parser/parser.cpp b/ApiExtractor/parser/parser.cpp
index c56369c31..c49785fb4 100644
--- a/ApiExtractor/parser/parser.cpp
+++ b/ApiExtractor/parser/parser.cpp
@@ -1124,6 +1124,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node)
token_stream.nextToken(); // skip ')'
parseCvQualify(ast->fun_cv);
+ parseNoExcept();
parseExceptionSpecification(ast->exception_spec);
if (token_stream.lookAhead() == Token___attribute__)
@@ -1863,6 +1864,14 @@ bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST *&node)
return false;
}
+bool Parser::parseNoExcept()
+{
+ // right now we only accept 'noexcept' with no conditional
+ CHECK(Token_noexcept);
+
+ return true;
+}
+
bool Parser::parseExceptionSpecification(ExceptionSpecificationAST *&node)
{
std::size_t start = token_stream.cursor();
diff --git a/ApiExtractor/parser/parser.h b/ApiExtractor/parser/parser.h
index 8f31c1389..af3c221c8 100644
--- a/ApiExtractor/parser/parser.h
+++ b/ApiExtractor/parser/parser.h
@@ -119,6 +119,7 @@ public:
bool parseNewExpression(ExpressionAST *&node);
bool parseNewInitializer(NewInitializerAST *&node);
bool parseNewTypeId(NewTypeIdAST *&node);
+ bool parseNoExcept();
bool parseOperator(OperatorAST *&node);
bool parseOperatorFunctionId(OperatorFunctionIdAST *&node);
bool parseParameterDeclaration(ParameterDeclarationAST *&node);
diff --git a/ApiExtractor/parser/tokens.cpp b/ApiExtractor/parser/tokens.cpp
index e3008dea9..34737d100 100644
--- a/ApiExtractor/parser/tokens.cpp
+++ b/ApiExtractor/parser/tokens.cpp
@@ -86,6 +86,7 @@ static char const * const _S_token_names[] = {
"mutable",
"namespace",
"new",
+ "noexcept",
"not",
"not_eq",
"number_literal",
diff --git a/ApiExtractor/parser/tokens.h b/ApiExtractor/parser/tokens.h
index dbe612da0..20c17a76f 100644
--- a/ApiExtractor/parser/tokens.h
+++ b/ApiExtractor/parser/tokens.h
@@ -87,6 +87,7 @@ enum TOKEN_KIND {
Token_mutable,
Token_namespace,
Token_new,
+ Token_noexcept,
Token_not,
Token_not_eq,
Token_number_literal,
diff --git a/tests/libsample/photon.h b/tests/libsample/photon.h
index 18917e26c..1f8483ef4 100644
--- a/tests/libsample/photon.h
+++ b/tests/libsample/photon.h
@@ -96,6 +96,38 @@ LIBSAMPLE_API int callCalculateForValueDuplicatorReference(ValueDuplicator& valu
LIBSAMPLE_API int countValueIdentities(const std::list<ValueIdentity>& values);
LIBSAMPLE_API int countValueDuplicators(const std::list<TemplateBase<DuplicatorType> >& values);
+// This simulates an internal error (SEGV) caused by 'noexcept' in
+// boost::intrusive_ptr before support for 'noexcept' was added. The ENTIRE
+// code below is needed to trigger the exception; it isn't seen with just a
+// 'noexcept' following a declaration.
+//
+// NOTE: For reasons that should be fairly obvious, this test unfortunately can
+// only be "run" when building in C++11 mode.
+#if __cplusplus < 201103L
+#define noexcept
+#endif
+class Pointer
+{
+public:
+ Pointer() noexcept : px(0) {}
+ Pointer(int* p) : px(p) {}
+
+ void reset() noexcept { Pointer().swap(*this); }
+
+ int* get() const noexcept { return px; }
+ int& operator*() const { return *px; }
+
+ void swap(Pointer& rhs) noexcept
+ {
+ int* tmp = px;
+ px = rhs.px;
+ rhs.px = tmp;
+ }
+
+private:
+ int* px;
+};
+
} // namespace Photon
#endif // PHOTON_H