[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