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 Prantlvoid foo() { 56bdffea12SAdrian Prantl M::Template<bool&> TB1; 57bdffea12SAdrian Prantl TB1.isRef; 58bdffea12SAdrian Prantl } 59bdffea12SAdrian Prantl 60bdffea12SAdrian Prantl #endif 61