Get rid of the [[final]] C++0x attribute.

llvm-svn: 124083
diff --git a/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.final/p4.cpp b/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.final/p4.cpp
deleted file mode 100644
index cac3624..0000000
--- a/clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.final/p4.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
-
-struct B1 {
-  [[final]] virtual void f(); // expected-note {{overridden virtual function is here}}
-};
-
-struct D1 : B1 {
-  void f(); // expected-error {{declaration of 'f' overrides a 'final' function}}
-};
-
-struct [[final]] B2 { // expected-note {{'B2' declared here}}
-};
-
-struct D2 : B2 { // expected-error {{derivation from 'final' struct B2}}
-};
diff --git a/clang/test/CodeGenCXX/attr-final-devirtualize-virtual-function-calls.cpp b/clang/test/CodeGenCXX/attr-final-devirtualize-virtual-function-calls.cpp
deleted file mode 100644
index a450780..0000000
--- a/clang/test/CodeGenCXX/attr-final-devirtualize-virtual-function-calls.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-// RUN: %clang_cc1 %s -O3 -emit-llvm -o - | FileCheck %s
-
-namespace Test1 {
-  struct A {
-    virtual int f() __attribute__((final)) { return 1; }
-  };
-
-  // CHECK: define i32 @_ZN5Test11fEPNS_1AE
-  int f(A *a) {
-    // CHECK: ret i32 1
-    return a->f();
-  }
-}
-
-namespace Test2 {
-  struct __attribute__((final)) A {
-    virtual int f() { return 1; }
-  };
-
-  // CHECK: define i32 @_ZN5Test21fEPNS_1AE
-  int f(A *a) {
-    // CHECK: ret i32 1
-    return a->f();
-  }
-}
diff --git a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
new file mode 100644
index 0000000..f6f2a49
--- /dev/null
+++ b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
+
+namespace Test1 {
+  struct A {
+    virtual int f() final;
+  };
+
+  // CHECK: define i32 @_ZN5Test11fEPNS_1AE
+  int f(A *a) {
+    // CHECK: call i32 @_ZN5Test11A1fEv
+    return a->f();
+  }
+}
+
+namespace Test2 {
+  struct A final {
+    virtual int f();
+  };
+
+  // CHECK: define i32 @_ZN5Test21fEPNS_1AE
+  int f(A *a) {
+    // CHECK: call i32 @_ZN5Test21A1fEv
+    return a->f();
+  }
+}
diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
index 67b2ea6..9956427 100644
--- a/clang/test/Parser/cxx0x-attributes.cpp
+++ b/clang/test/Parser/cxx0x-attributes.cpp
@@ -29,7 +29,6 @@
 [[]] using namespace ns;
 
 // Argument tests
-[[final()]] int final_params; // expected-error {{C++0x attribute 'final' cannot have an argument list}}
 [[align]] int aligned_no_params; // expected-error {{C++0x attribute 'align' must have an argument list}}
 [[align(i)]] int aligned_nonconst; // expected-error {{'aligned' attribute requires integer constant}}
 
diff --git a/clang/test/SemaCXX/attr-cxx0x.cpp b/clang/test/SemaCXX/attr-cxx0x.cpp
index 4d1e47f..5570f67 100644
--- a/clang/test/SemaCXX/attr-cxx0x.cpp
+++ b/clang/test/SemaCXX/attr-cxx0x.cpp
@@ -1,13 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
 
-int final_fail [[final]]; //expected-error {{'final' attribute only applies to virtual method or class types}}
-
-struct [[final]] final_base { }; // expected-note {{'final_base' declared here}}
-struct final_child : final_base { }; // expected-error {{derivation from 'final' struct final_base}}
-
-struct final_member { virtual void quux [[final]] (); }; // expected-note {{overridden virtual function is here}}
-struct final_override : final_member { virtual void quux (); }; // expected-error {{declaration of 'quux' overrides a 'final' function}}
-
 int align_illegal [[align(3)]]; //expected-error {{requested alignment is not a power of 2}}
 char align_big [[align(int)]];
 int align_small [[align(1)]]; // FIXME: this should be rejected