]> granicus.if.org Git - clang/commitdiff
Extend the parser to support pack expansions within exception
authorDouglas Gregor <dgregor@apple.com>
Mon, 20 Dec 2010 23:57:46 +0000 (23:57 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 20 Dec 2010 23:57:46 +0000 (23:57 +0000)
specifications. We can't yet instantiate them, however, since I
tripped over PR8835.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122292 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseDeclCXX.cpp
test/CXX/temp/temp.decls/temp.variadic/p4.cpp

index a2c87f85c304263b0bf262df1e69d58e87a354a6..e1f7f7bdc5891e3263af7cb2c2193b22db844329 100644 (file)
@@ -1875,8 +1875,8 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) {
 /// [MS]    'throw' '(' '...' ')'
 ///
 ///       type-id-list:
-///         type-id
-///         type-id-list ',' type-id
+///         type-id ... [opt]
+///         type-id-list ',' type-id ... [opt]
 ///
 bool Parser::ParseExceptionSpecification(SourceLocation &EndLoc,
                                          llvm::SmallVectorImpl<ParsedType>
@@ -1908,10 +1908,21 @@ bool Parser::ParseExceptionSpecification(SourceLocation &EndLoc,
   SourceRange Range;
   while (Tok.isNot(tok::r_paren)) {
     TypeResult Res(ParseTypeName(&Range));
+    
+    if (Tok.is(tok::ellipsis)) {
+      // C++0x [temp.variadic]p5:
+      //   - In a dynamic-exception-specification (15.4); the pattern is a 
+      //     type-id.
+      SourceLocation Ellipsis = ConsumeToken();
+      if (!Res.isInvalid())
+        Res = Actions.ActOnPackExpansion(Res.get(), Ellipsis);
+    }
+    
     if (!Res.isInvalid()) {
       Exceptions.push_back(Res.get());
       Ranges.push_back(Range);
     }
+    
     if (Tok.is(tok::comma))
       ConsumeToken();
     else
index b4f7c09981ff9d3c73f4c52c424653de333cd408..7d2fe850361d70fd32acd223cb99d14dc046ee2b 100644 (file)
@@ -26,3 +26,21 @@ struct identity {
 tuple<int, float> *t_int_float;
 extract_nested_types<identity<int>, identity<float> >::types *t_int_float_2 
   = t_int_float;
+
+// In a dynamic-exception-specification (15.4); the pattern is a type-id.
+template<typename ...Types>
+struct f_with_except {
+  virtual void f() throw(Types...);
+};
+
+// FIXME: the code below requires the ability to instantiate pack
+// expansions whose pattern is a type-id.
+#if 0
+struct check_f_with_except_1 : f_with_except<int, float> {
+  virtual void f() throw(int, float);
+};
+
+struct check_f_with_except_2 : f_with_except<int, float> {
+  virtual void f() throw(int);
+};
+#endif