]> granicus.if.org Git - clang/commitdiff
Add serialization support for ClassScopeFunctionSpecializationDecl.
authorFrancois Pichet <pichet2000@gmail.com>
Wed, 17 Aug 2011 01:06:54 +0000 (01:06 +0000)
committerFrancois Pichet <pichet2000@gmail.com>
Wed, 17 Aug 2011 01:06:54 +0000 (01:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137799 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclBase.cpp
lib/Serialization/ASTReaderDecl.cpp
lib/Serialization/ASTWriterDecl.cpp
test/PCH/cxx-ms-function-specialization-class-scope.cpp [new file with mode: 0644]
test/PCH/cxx-ms-function-specialization-class-scope.h [new file with mode: 0644]

index 5e5ec93e17ebd808ca3c59d54530e7e48db8541f..ca3f5b563c069ea76e344286626d31777a9d51d1 100644 (file)
@@ -628,7 +628,8 @@ void Decl::CheckAccessDeclContext() const {
       isa<ParmVarDecl>(this) ||
       // FIXME: a ClassTemplateSpecialization or CXXRecordDecl can have
       // AS_none as access specifier.
-      isa<CXXRecordDecl>(this))
+      isa<CXXRecordDecl>(this) ||
+      isa<ClassScopeFunctionSpecializationDecl>(this))
     return;
 
   assert(Access != AS_none &&
index 66316bc1e167cb4edd0fefeaed9d1ac23c63a9c2..0c29b34b6faa8ed3d8aa18552e7042a0b675409a 100644 (file)
@@ -123,6 +123,8 @@ namespace clang {
                                             ClassTemplateSpecializationDecl *D);
     void VisitClassTemplatePartialSpecializationDecl(
                                      ClassTemplatePartialSpecializationDecl *D);
+    void VisitClassScopeFunctionSpecializationDecl(\r
+                                       ClassScopeFunctionSpecializationDecl *D);\r
     void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
     void VisitValueDecl(ValueDecl *VD);
     void VisitEnumConstantDecl(EnumConstantDecl *ECD);
@@ -1215,6 +1217,12 @@ void ASTDeclReader::VisitClassTemplatePartialSpecializationDecl(
   }
 }
 
+void ASTDeclReader::VisitClassScopeFunctionSpecializationDecl(\r
+                                    ClassScopeFunctionSpecializationDecl *D) {\r
+  VisitDecl(D);
+  D->Specialization = ReadDeclAs<CXXMethodDecl>(Record, Idx);
+}
+
 void ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
   VisitRedeclarableTemplateDecl(D);
 
index 3e1a42c52d58d47f9f2a491367dbf84946bb1554..efc1ea30efd8130e6df8e922682d6b933cd1df03 100644 (file)
@@ -65,6 +65,8 @@ namespace clang {
                                             ClassTemplateSpecializationDecl *D);
     void VisitClassTemplatePartialSpecializationDecl(
                                      ClassTemplatePartialSpecializationDecl *D);
+    void VisitClassScopeFunctionSpecializationDecl(\r
+                                       ClassScopeFunctionSpecializationDecl *D);\r
     void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
     void VisitValueDecl(ValueDecl *D);
     void VisitEnumConstantDecl(EnumConstantDecl *D);
@@ -1109,6 +1111,14 @@ void ASTDeclWriter::VisitClassTemplatePartialSpecializationDecl(
   Code = serialization::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION;
 }
 
+void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl(\r
+                                    ClassScopeFunctionSpecializationDecl *D) {\r
+  VisitDecl(D);
+  Writer.AddDeclRef(D->getSpecialization(), Record);
+  Code = serialization::DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION;
+}
+
+
 void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
   VisitRedeclarableTemplateDecl(D);
 
diff --git a/test/PCH/cxx-ms-function-specialization-class-scope.cpp b/test/PCH/cxx-ms-function-specialization-class-scope.cpp
new file mode 100644 (file)
index 0000000..1803a11
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fms-extensions -triple i386-unknown-unknown  -x c++-header -emit-pch -o %t %S/cxx-ms-function-specialization-class-scope.h
+// RUN: %clang_cc1 -fms-extensions -triple i386-unknown-unknown -include-pch %t -fsyntax-only -verify %s 
+
+
+void test2()
+{
+   B<char> b(3);
+   char* ptr;
+   b.f(ptr);
+   b.f<int>(99);
+   b.f(100);
+}
+
diff --git a/test/PCH/cxx-ms-function-specialization-class-scope.h b/test/PCH/cxx-ms-function-specialization-class-scope.h
new file mode 100644 (file)
index 0000000..7668e73
--- /dev/null
@@ -0,0 +1,29 @@
+
+
+
+template <class T>
+class B {
+public:
+       template <class U>
+    B(U p) { 
+       }
+       template <>
+    B(int p) { // expected-warning{{explicit specialization of 'B<T>' within class scope is a Microsoft extension}}
+       }
+       
+       template <class U>
+    void f(U p) {
+         T y = 9;
+       }
+
+
+    template <>
+    void f(int p) { // expected-warning{{explicit specialization of 'f' within class scope is a Microsoft extension}}
+         T a = 3;
+       }
+
+       void f(int p) { 
+         T a = 3;
+    }
+};
+