xref: /llvm-project/llvm/test/tools/dsymutil/X86/modules-pruning.cpp (revision 3d0213e4835dddb5b278c0c8ef028070e58731cc)
1bdffea12SAdrian Prantl // RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/modules-pruning \
2*3d0213e4SJonas Devlieghere // RUN:   -verify \
3bdffea12SAdrian Prantl // RUN:   -y %p/dummy-debug-map.map -o - \
4bdffea12SAdrian Prantl // RUN:     | llvm-dwarfdump --name isRef -p - | FileCheck %s
5bdffea12SAdrian Prantl 
6bdffea12SAdrian Prantl /* Compile with:
7bdffea12SAdrian Prantl    cat >modules.modulemap <<EOF
8bdffea12SAdrian Prantl    module Outer {
9bdffea12SAdrian Prantl      module Template {
10bdffea12SAdrian Prantl        header "template.h"
11bdffea12SAdrian Prantl        export *
12bdffea12SAdrian Prantl      }
13bdffea12SAdrian Prantl    }
14bdffea12SAdrian Prantl EOF
15bdffea12SAdrian Prantl    clang++ -D TEMPLATE_H -E -o template.h modules-pruning.cpp
16bdffea12SAdrian Prantl    clang++ -c -fcxx-modules -fmodules -fmodule-map-file=modules.modulemap \
17bdffea12SAdrian Prantl      -g -gmodules -fmodules-cache-path=. \
18bdffea12SAdrian Prantl      -Xclang -fdisable-module-hash modules-pruning.cpp -o 1.o
19bdffea12SAdrian Prantl */
20bdffea12SAdrian Prantl 
21bdffea12SAdrian Prantl // CHECK: DW_TAG_compile_unit
22bdffea12SAdrian Prantl // CHECK:   DW_TAG_module
23bdffea12SAdrian Prantl // CHECK:     DW_TAG_module
24bdffea12SAdrian Prantl // CHECK:       DW_TAG_class
25bdffea12SAdrian Prantl // CHECK:         DW_TAG_member
26bdffea12SAdrian Prantl // CHECK:           DW_AT_name ("isRef")
27bdffea12SAdrian Prantl // CHECK:           DW_AT_declaration (true)
28bdffea12SAdrian Prantl // CHECK:           DW_AT_const_value (1)
29bdffea12SAdrian Prantl // CHECK-NOT: DW_TAG
30bdffea12SAdrian Prantl 
31bdffea12SAdrian Prantl #ifdef TEMPLATE_H
32bdffea12SAdrian Prantl 
33bdffea12SAdrian Prantl namespace M {
34bdffea12SAdrian Prantl struct false_type {
35bdffea12SAdrian Prantl   static const bool value = false;
36bdffea12SAdrian Prantl };
37bdffea12SAdrian Prantl struct true_type {
38bdffea12SAdrian Prantl   static const bool value = true;
39bdffea12SAdrian Prantl };
40bdffea12SAdrian Prantl 
41bdffea12SAdrian Prantl template <class T> struct is_reference      : false_type {};
42bdffea12SAdrian Prantl template <class T> struct is_reference<T&>  : true_type {};
43bdffea12SAdrian Prantl 
44bdffea12SAdrian Prantl template<class T>
45bdffea12SAdrian Prantl class Template {
46bdffea12SAdrian Prantl public:
47bdffea12SAdrian Prantl   static const bool isRef = is_reference<T>::value;
Template()48bdffea12SAdrian Prantl   Template() {}
49bdffea12SAdrian Prantl };
50bdffea12SAdrian Prantl }
51bdffea12SAdrian Prantl #else
52bdffea12SAdrian Prantl 
53bdffea12SAdrian Prantl #include "template.h"
54bdffea12SAdrian Prantl 
foo()55bdffea12SAdrian Prantl void foo() {
56bdffea12SAdrian Prantl   M::Template<bool&> TB1;
57bdffea12SAdrian Prantl   TB1.isRef;
58bdffea12SAdrian Prantl }
59bdffea12SAdrian Prantl 
60bdffea12SAdrian Prantl #endif
61