[cfe-dev] __attribute__((noreturn))

Talin viridia at gmail.com
Tue May 10 23:47:21 PDT 2011


On Tue, May 10, 2011 at 9:08 PM, John McCall <rjmccall at apple.com> wrote:

> On May 10, 2011, at 8:28 PM, Talin wrote:
> > I'm having some trouble getting clang to work with
> LLVM_ATTRIBUTE_NORETURN defined in Support/Compiler.h. There are several
> problems:
> >
> > First there's a problem with the macros themselves - AFAIK
> __declspec(noreturn) has to come at the *front* of the declaration, while
> __attribute__((noreturn)) has to come *after* it. The usual way of dealing
> with this is to define a macro which surrounds the declaration like so:
>
> You can certainly put __attribute__((noreturn)) in the
> declaration-specifiers of a function.  In fact, I think this is the only
> supported way of putting an attribute on a function definition (rather than
> just a declaration).  And it works in GCC, too.
>
> > So my first question is - has anyone ever tried using these macros under
> Windows?
>
> There are public buildbots which compile LLVM and Clang under MSVC.  Also,
> these macros are used in ErrorHandling.h, which is probably included in a
> solid 75% of the files in LLVM.
>

OK - sorry for going hyperbolic there...

>
> > However, there's a more fundamental problem, which is that clang seems to
> be ignoring the __attribute__((noreturn)) altogether. That is, instead of
> relying on the above macros, if I just paste the noreturn attribute after my
> function, I still get "error: control reaches end of non-void function" in
> many places - errors which I wasn't getting with gcc.
>
> You'll need to provide a bit more detail than that, because it's certainly
> working in the test cases I've seen.
>
> All right - here's what I have (with much detail omitted):

  class Diagnostics {
  public:
    LLVM_ATTRIBUTE_NORETURN void __fail(const char * msg, const char *
fname, unsigned lineno);
  };

  Diagnostics diag;

  std::istream & ArchiveFile::open() {
    diag.__fail("Invalid operation: ArchiveFile::open", __FILE__, __LINE__);
  };

And I get this error:

/Users/talin/Projects/tart/trunk/compiler/lib/Common/SourceFile.cpp:110:1:
error: control reaches end of non-void function [-Werror,-Wreturn-type]

And here's the command line:

   clang -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D_GNU_SOURCE
-mmacosx-version-min=10.5 -g -I/Users/talin/Projects/tart/build-eclipse
-I/Users/talin/Projects/tart/trunk/compiler/include
-I/Users/talin/Projects/tart/trunk/linker/include
-I/Users/talin/Projects/llvm-inst/include -Wall -Wextra -Werror -Wcast-align
-Wpointer-arith -Wno-deprecated -Wno-unused-parameter -fno-rtti
-fno-exceptions -fPIC -o CMakeFiles/compiler.dir/lib/Common/SourceFile.cpp.o
-c /Users/talin/Projects/tart/trunk/compiler/lib/Common/SourceFile.cpp

-- 
-- Talin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110510/7bcba9bf/attachment.html>


More information about the cfe-dev mailing list