[PATCH] Fix for Bug 19480 -- Adding a test case.
Eric Christopher
echristo at gmail.com
Thu Jul 3 11:21:09 PDT 2014
On Thu, Jul 3, 2014 at 11:08 AM, Larisse Voufo <lvoufo at gmail.com> wrote:
> I pushed the previous patch in since it is a simple extension of existing template implementation logic for variable templates, which continues a trend that we started last summer.
>
I'm talking less about the particular pass, but the development
process. Once a patch is out for review you need to wait for approval
to commit. Do feel free to commit what you consider to be an obvious
patch in the future, however...
> Now, I am adding a test case.
Please make sure to add a test case in the future when you commit.
-eric
> I am not very experienced in writing linkage-level test cases yet. So, I could use additional pairs of eyes. Could someone please take a quick look and let me know if it's okay to go asap?
>
> http://reviews.llvm.org/D4362
>
> Files:
> test/CodeGenCXX/cxx1y-variable-template-linkage.cpp
>
> Index: test/CodeGenCXX/cxx1y-variable-template-linkage.cpp
> ===================================================================
> --- /dev/null
> +++ test/CodeGenCXX/cxx1y-variable-template-linkage.cpp
> @@ -0,0 +1,57 @@
> +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-optzns %s -o - -DFILEA | FileCheck %s -check-prefix=CHECKA
> +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-optzns -fcxx-exceptions %s -o - -DFILEB | FileCheck %s -check-prefix=CHECKB
> +// expected-no-diagnostics
> +
> +// The variable template specialization x<Foo> generated in each file
> +// should be 'internal global' and not 'linkonce_odr global'.
> +
> +// File A
> +#ifdef FILEA
> +
> +template <typename T> int x = 42;
> +
> +// CHECKA-DAG: @_Z1xIZL3foovE3FooE = internal global
> +
> +// CHECKA-DAG: define internal nonnull i32* @_ZL3foov(
> +static int &foo() {
> + struct Foo { };
> +
> + // CHECKA-DAG: ret i32* @_Z1xIZL3foovE3FooE
> + return x<Foo>;
> +}
> +
> +// CHECKA-DAG: define nonnull i32* @_Z3barv(
> +int &bar() {
> + // CHECKA-DAG: %call = call nonnull i32* @_ZL3foov()
> + return foo();
> +}
> +
> +#endif // end of FILE A
> +
> +
> +// File B
> +#ifdef FILEB
> +
> +template <typename T> int x = 42;
> +
> +// CHECKB-DAG: @_Z1xIZL3foovE3FooE = internal global
> +
> +// CHECKB-DAG: define internal nonnull i32* @_ZL3foov(
> +static int &foo() {
> + struct Foo { };
> +
> + // CHECKB-DAG: ret i32* @_Z1xIZL3foovE3FooE
> + return x<Foo>;
> +}
> +
> +// CHECKB-DAG: declare nonnull i32* @_Z3barv(
> +int &bar();
> +
> +int main() {
> + // CHECKB-DAG: %call = call nonnull i32* @_Z3barv()
> + // CHECKB-DAG: %call1 = call nonnull i32* @_ZL3foov()
> + &bar() == &foo() ? throw 0 : (void)0; // Should not throw exception at runtime.
> +}
> +
> +#endif // end of FILE B
> +
More information about the cfe-commits
mailing list