<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - A template-friend bug of bound friend templates"
   href="https://bugs.llvm.org/show_bug.cgi?id=34624">34624</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>A template-friend bug of bound friend templates
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>4.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Macintosh
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>MacOS X
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>C++11
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>question123446@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>First: 
$ clang++ -v
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /usr/local/bin

********************************

I write code as below:

#include <iostream>

using namespace std;

//template <typename T>
//class A;
//
//template <typename T>
//bool operator == (const A<T> & a1, const A<T> & a2);

template <typename T>
class A {
        friend bool operator ==<> (const A & a1, const A & a2); 
};

template <typename T>
bool operator == (const A<T> & a1, const A<T> & a2)
{
        return true;
}

int main(int argc, char *argv[]) 
{
        A<int> a1, a2;
        cout << (a1 == a2) << endl;

//      if (a1 == a2) {
//              cout << "......" << endl;
//      }
}

I used `clang++ -std=c++11 bound\ friend\ templates.cc -o bound\ friend\
templates`.
This can pass the compiler. However, C++ standards don't allow this. We'd use a
declaration to declare the class and the operator == function, as the
annotation above. This is the first bug.

Besides, when I use `./` to run this program, it's interesting to see the
standard output shows nothing instead of `1`. So I cancelled the annotation in
`main` function. Then, clang++ turns to bug.

*************** clang++ Error message *********************

0  clang-4.0                0x000000010f432e1b
llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40
1  clang-4.0                0x000000010f4323b3 llvm::sys::RunSignalHandlers() +
83
2  clang-4.0                0x000000010f43323a SignalHandler(int) + 195
3  libsystem_platform.dylib 0x00007fff9ebd0b3a _sigtramp + 26
4  libsystem_platform.dylib 0x00007fdd13c1fc10 _sigtramp + 1963258096
5  clang-4.0                0x000000010f6033f7 (anonymous
namespace)::ScalarExprEmitter::Visit(clang::Expr*) + 43
6  clang-4.0                0x000000010f6033c6
clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) + 50
7  clang-4.0                0x000000010f5dcfb1
clang::CodeGen::CodeGenFunction::EvaluateExprAsBool(clang::Expr const*) + 295
8  clang-4.0                0x000000010f69193f
clang::CodeGen::CodeGenFunction::EmitBranchOnBoolExpr(clang::Expr const*,
llvm::BasicBlock*, llvm::BasicBlock*, unsigned long long) + 1857
9  clang-4.0                0x000000010f667440
clang::CodeGen::CodeGenFunction::EmitIfStmt(clang::IfStmt const&) + 416
10 clang-4.0                0x000000010f66c453
clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt
const&, bool, clang::CodeGen::AggValueSlot) + 83
11 clang-4.0                0x000000010f690498
clang::CodeGen::CodeGenFunction::EmitFunctionBody(clang::CodeGen::FunctionArgList&,
clang::Stmt const*) + 88
12 clang-4.0                0x000000010f690a7c
clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl,
llvm::Function*, clang::CodeGen::CGFunctionInfo const&) + 684
13 clang-4.0                0x000000010f69cf22
clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl,
llvm::GlobalValue*) + 254
14 clang-4.0                0x000000010f69a77c
clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl,
llvm::GlobalValue*) + 316
15 clang-4.0                0x000000010f69e29f
clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) + 169
16 clang-4.0                0x000000010f6eabc9 (anonymous
namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) + 125
17 clang-4.0                0x000000010f68acb6
clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) + 180
18 clang-4.0                0x000000010fd00861 clang::ParseAST(clang::Sema&,
bool, bool) + 319
19 clang-4.0                0x000000010f80374a clang::FrontendAction::Execute()
+ 76
20 clang-4.0                0x000000010f7d666b
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 605
21 clang-4.0                0x000000010f832398
clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3448
22 clang-4.0                0x000000010e6a23b9 cc1_main(llvm::ArrayRef<char
const*>, char const*, void*) + 1337
23 clang-4.0                0x000000010e6a101a main + 8096
24 libdyld.dylib            0x00007fff9e9c1235 start + 1
25 libdyld.dylib            0x0000000000000036 start + 1633938946
Stack dump:
0.      Program arguments: /usr/local/Cellar/llvm/4.0.0/bin/clang-4.0 -cc1
-triple x86_64-apple-macosx10.12.0 -Wdeprecated-objc-isa-usage
-Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free
-disable-llvm-verifier -discard-value-names -main-file-name Untitled 2.cpp
-mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim
-masm-verbose -munwind-tables -target-cpu penryn -target-linker-version 274.2
-dwarf-column-info -debugger-tuning=lldb -resource-dir
/usr/local/Cellar/llvm/4.0.0/bin/../lib/clang/4.0.0 -stdlib=libc++ -std=c++11
-fdeprecated-macro -fdebug-compilation-dir
/Users/zhengxiaolin/Documents/cpp/c++11/move -ferror-limit 19 -fmessage-length
101 -stack-protector 1 -fblocks -fobjc-runtime=macosx-10.12.0
-fencode-extended-block-signature -fcxx-exceptions -fexceptions
-fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o
/var/folders/wc/0c_zn09x12s_y90ccmvjb6900000gn/T/Untitled 2-a27030.o -x c++
Untitled 2.cpp
1.      <eof> parser at end of file
2.      Untitled 2.cpp:22:5: LLVM IR generation of declaration 'main'
3.      Untitled 2.cpp:22:5: Generating code for declaration 'main'
clang-4.0: error: unable to execute command: Segmentation fault: 11
clang-4.0: error: clang frontend command failed due to signal (use -v to see
invocation)
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /usr/local/bin
clang-4.0: note: diagnostic msg: PLEASE submit a bug report to
<a href="http://llvm.org/bugs/">http://llvm.org/bugs/</a> and include the crash backtrace, preprocessed source, and
associated run script.
clang-4.0: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-4.0: note: diagnostic msg:
/var/folders/wc/0c_zn09x12s_y90ccmvjb6900000gn/T/Untitled 2-44bbe2.cpp
clang-4.0: note: diagnostic msg:
/var/folders/wc/0c_zn09x12s_y90ccmvjb6900000gn/T/Untitled 2-44bbe2.sh
clang-4.0: note: diagnostic msg:
/var/folders/wc/0c_zn09x12s_y90ccmvjb6900000gn/T/Untitled 2-44bbe2.crash
clang-4.0: note: diagnostic msg:

********************

*************** clang++ Error message over ****************

At the first bug, I didn't write the declaration of the class and the operator
++ function. clang++ didn't give an error to me but g++ has:

*************** g++ Error message ***********************

Untitled 2.cpp: In instantiation of 'class A<int>':
Untitled 2.cpp:24:9:   required from here
Untitled 2.cpp:13:14: error: template-id 'operator==<>' for 'bool
operator==(const A<int>&, const A<int>&)' does not match any template
declaration
  friend bool operator ==<> (const A & a1, const A & a2);
              ^~~~~~~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/locale_facets.h:48:0,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/basic_ios.h:37,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:44,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/streambuf_iterator.h:204:5:
note: candidates are: template<class _CharT, class _Traits> bool
std::operator==(const std::istreambuf_iterator<_CharT, _Traits>&, const
std::istreambuf_iterator<_CharT, _Traits>&)
     operator==(const istreambuf_iterator<_CharT, _Traits>& __a,
     ^~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/ios_base.h:46:0,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:42,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/system_error:303:3: note:      
          bool std::operator==(const std::error_condition&, const
std::error_condition&)
   operator==(const error_condition& __lhs,
   ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/system_error:296:3: note:      
          bool std::operator==(const std::error_condition&, const
std::error_code&)
   operator==(const error_condition& __lhs, const error_code& __rhs) noexcept
   ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/system_error:289:3: note:      
          bool std::operator==(const std::error_code&, const
std::error_condition&)
   operator==(const error_code& __lhs, const error_condition& __rhs) noexcept
   ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/system_error:284:3: note:      
          bool std::operator==(const std::error_code&, const std::error_code&)
   operator==(const error_code& __lhs, const error_code& __rhs) noexcept
   ^~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/string:52:0,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/locale_classes.h:40,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/ios_base.h:41,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:42,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/basic_string.h:5084:5:
note:                 template<class _CharT, class _Traits, class _Alloc> bool
std::operator==(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&,
const _CharT*)
     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/basic_string.h:5072:5:
note:                 template<class _CharT, class _Traits, class _Alloc> bool
std::operator==(const _CharT*, const std::__cxx11::basic_string<_CharT,
_Traits, _Alloc>&)
     operator==(const _CharT* __lhs,
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/basic_string.h:5058:5:
note:                 template<class _CharT> typename
__gnu_cxx::__enable_if<std::__is_char<_Tp>::__value, bool>::__type
std::operator==(const std::__cxx11::basic_string<_CharT>&, const
std::__cxx11::basic_string<_CharT>&)
     operator==(const basic_string<_CharT>& __lhs,
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/basic_string.h:5050:5:
note:                 template<class _CharT, class _Traits, class _Alloc> bool
std::operator==(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&,
const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/string:41:0,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/locale_classes.h:40,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/ios_base.h:41,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:42,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/allocator.h:152:5: note:  
              template<class _Tp> bool std::operator==(const
std::allocator<_CharT>&, const std::allocator<_CharT>&)
     operator==(const allocator<_Tp>&, const allocator<_Tp>&)
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/allocator.h:146:5: note:  
              template<class _T1, class _T2> bool std::operator==(const
std::allocator<_CharT>&, const std::allocator<_T2>&)
     operator==(const allocator<_T1>&, const allocator<_T2>&)
     ^~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_algobase.h:67:0,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/char_traits.h:39,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:40,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_iterator.h:1119:5:
note:                 template<class _Iterator> bool std::operator==(const
std::move_iterator<_IteratorL>&, const std::move_iterator<_IteratorL>&)
     operator==(const move_iterator<_Iterator>& __x,
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_iterator.h:1113:5:
note:                 template<class _IteratorL, class _IteratorR> bool
std::operator==(const std::move_iterator<_IteratorL>&, const
std::move_iterator<_IteratorR>&)
     operator==(const move_iterator<_IteratorL>& __x,
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_iterator.h:349:5:
note:                 template<class _IteratorL, class _IteratorR> bool
std::operator==(const std::reverse_iterator<_Iterator>&, const
std::reverse_iterator<_IteratorR>&)
     operator==(const reverse_iterator<_IteratorL>& __x,
     ^~~~~~~~
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_iterator.h:292:5:
note:                 template<class _Iterator> bool std::operator==(const
std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)
     operator==(const reverse_iterator<_Iterator>& __x,
     ^~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_algobase.h:64:0,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/char_traits.h:39,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:40,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/stl_pair.h:431:5: note:   
             template<class _T1, class _T2> constexpr bool
std::operator==(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)
     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
     ^~~~~~~~
In file included from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iosfwd:40:0,
                 from /usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ios:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/ostream:38,
                 from
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/iostream:39,
                 from Untitled 2.cpp:1:
/usr/local/Cellar/gcc/6.3.0_1/include/c++/6.3.0/bits/postypes.h:216:5: note:   
             template<class _StateT> bool std::operator==(const
std::fpos<_StateT>&, const std::fpos<_StateT>&)
     operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
     ^~~~~~~~

****************** g++ Error message over ************************

These two bugs are what I met today.
Best regards,
Andy</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>