[cfe-commits] r121899 - in /cfe/trunk: lib/Sema/SemaTemplateVariadic.cpp test/CXX/temp/temp.decls/temp.variadic/p5.cpp

Douglas Gregor dgregor at apple.com
Wed Dec 15 13:57:59 PST 2010


Author: dgregor
Date: Wed Dec 15 15:57:59 2010
New Revision: 121899

URL: http://llvm.org/viewvc/llvm-project?rev=121899&view=rev
Log:
Test that all of the relevant types properly compute the "contains
unexpanded parameter pack" bit and that the recursive AST visitor can
then find those unexpanded parameter packs.

Modified:
    cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
    cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp?rev=121899&r1=121898&r2=121899&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp Wed Dec 15 15:57:59 2010
@@ -103,9 +103,14 @@
       return true;
     }
 
-    /// \brief Suppress traversal of declarations, since they cannot
-    /// contain unexpanded parameter packs.
-    bool TraverseDecl(Decl *D) { return true; }
+    /// \brief Suppress traversal of non-parameter declarations, since
+    /// they cannot contain unexpanded parameter packs.
+    bool TraverseDecl(Decl *D) { 
+      if (D && isa<ParmVarDecl>(D))
+        return inherited::TraverseDecl(D);
+
+      return true; 
+    }
   };
 }
 

Modified: cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp?rev=121899&r1=121898&r2=121899&view=diff
==============================================================================
--- cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp (original)
+++ cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp Wed Dec 15 15:57:59 2010
@@ -1,13 +1,99 @@
-// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++0x -fblocks -fsyntax-only -verify %s
 
 
 // An appearance of a name of a parameter pack that is not expanded is
 // ill-formed.
-template<typename ... Types>
+
+template<typename T, typename U> struct pair;
+
+// Test for unexpanded parameter packs in each of the type nodes.
+template<typename T, int N, typename ... Types>
 struct TestPPName 
-  : public Types  // expected-error{{base type contains unexpanded parameter pack 'Types'}}
+  : public Types, public T  // expected-error{{base type contains unexpanded parameter pack 'Types'}}
 {
+  // BuiltinType is uninteresting
+  // FIXME: ComplexType is uninteresting?
+  // PointerType
   typedef Types *types_pointer; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+
+  // BlockPointerType
+  typedef Types (^block_pointer_1)(int); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+  typedef int (^block_pointer_2)(Types); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+
+  // LValueReferenceType
+  typedef Types &lvalue_ref; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+
+  // RValueReferenceType
+  typedef Types &&rvalue_ref; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+
+  // MemberPointerType
+  typedef Types TestPPName::* member_pointer_1; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+  typedef int Types::*member_pointer_2; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // ConstantArrayType
+  typedef Types constant_array[17]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // IncompleteArrayType
+  typedef Types incomplete_array[]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // VariableArrayType
+  void f(int i) {
+    Types variable_array[i]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+  }
+
+  // DependentSizedArrayType
+  typedef Types dependent_sized_array[N]; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // DependentSizedExtVectorType
+  typedef Types dependent_sized_ext_vector __attribute__((ext_vector_type(N))); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // VectorType is uninteresting
+
+  // ExtVectorType
+  typedef Types ext_vector __attribute__((ext_vector_type(4))); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // FunctionProtoType
+  typedef Types (function_type_1)(int); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+  typedef int (function_type_2)(Types); // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // FunctionNoProtoType is uninteresting
+  // UnresolvedUsingType is uninteresting
+  // ParenType is uninteresting
+  // TypedefType is uninteresting
+
+  // TypeOfExprType
+  typedef __typeof__((static_cast<Types>(0))) typeof_expr; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // TypeOfType
+  typedef __typeof__(Types) typeof_type;  // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // DecltypeType
+  typedef decltype((static_cast<Types>(0))) typeof_expr; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // RecordType is uninteresting
+  // EnumType is uninteresting
+  // ElaboratedType is uninteresting
+
+  // TemplateTypeParmType
+  typedef Types template_type_parm; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // SubstTemplateTypeParmType is uninteresting
+
+  // TemplateSpecializationType
+  typedef pair<Types, int> template_specialization; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // InjectedClassName is uninteresting.
+
+  // DependentNameType
+  typedef typename Types::type dependent_name; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // DependentTemplateSpecializationType
+  typedef typename Types::template apply<int> dependent_name_1; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+  typedef typename T::template apply<Types> dependent_name_2; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}} 
+
+  // ObjCObjectType is uninteresting
+  // ObjCInterfaceType is uninteresting
+  // ObjCObjectPointerType is uninteresting
 };
 
 template<typename ... Types>





More information about the cfe-commits mailing list