r180591 - Add r180263 back, but fix hasBraces() to be correct during parsing.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Thu Apr 25 18:54:39 PDT 2013


HI Douglas,

I would normally wait for your review on this, but it seemed fairly
safe and fixed a buildbot  broken by the previous patch fixing one
line extern C declarations.

Let me know if you are OK with this patch.

On 25 April 2013 21:30, Rafael Espindola <rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Thu Apr 25 20:30:23 2013
> New Revision: 180591
>
> URL: http://llvm.org/viewvc/llvm-project?rev=180591&view=rev
> Log:
> Add r180263 back, but fix hasBraces() to be correct during parsing.
>
> Original commit message:
>
> Fix a case in linkage computation that should check for single line extern "C".
>
> Modified:
>     cfe/trunk/include/clang/AST/DeclCXX.h
>     cfe/trunk/lib/AST/Decl.cpp
>     cfe/trunk/lib/AST/DeclCXX.cpp
>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>     cfe/trunk/test/SemaCXX/undefined-internal.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=180591&r1=180590&r2=180591&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
> +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Apr 25 20:30:23 2013
> @@ -2352,22 +2352,27 @@ public:
>  private:
>    /// Language - The language for this linkage specification.
>    LanguageIDs Language;
> +  /// True if this linkage spec has brances. This is needed so that hasBraces()
> +  /// returns the correct result while the linkage spec body is being parsed.
> +  /// Once RBraceLoc has been set this is not used, so it doesn't need to be
> +  /// serialized.
> +  bool HasBraces;
>    /// ExternLoc - The source location for the extern keyword.
>    SourceLocation ExternLoc;
>    /// RBraceLoc - The source location for the right brace (if valid).
>    SourceLocation RBraceLoc;
>
>    LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
> -                  SourceLocation LangLoc, LanguageIDs lang,
> -                  SourceLocation RBLoc)
> +                  SourceLocation LangLoc, LanguageIDs lang, bool HasBraces)
>      : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
> -      Language(lang), ExternLoc(ExternLoc), RBraceLoc(RBLoc) { }
> +      Language(lang), HasBraces(HasBraces), ExternLoc(ExternLoc),
> +      RBraceLoc(SourceLocation()) { }
>
>  public:
>    static LinkageSpecDecl *Create(ASTContext &C, DeclContext *DC,
>                                   SourceLocation ExternLoc,
>                                   SourceLocation LangLoc, LanguageIDs Lang,
> -                                 SourceLocation RBraceLoc = SourceLocation());
> +                                 bool HasBraces);
>    static LinkageSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID);
>
>    /// \brief Return the language specified by this linkage specification.
> @@ -2377,12 +2382,18 @@ public:
>
>    /// \brief Determines whether this linkage specification had braces in
>    /// its syntactic form.
> -  bool hasBraces() const { return RBraceLoc.isValid(); }
> +  bool hasBraces() const {
> +    assert(!RBraceLoc.isValid() || HasBraces);
> +    return HasBraces;
> +  }
>
>    SourceLocation getExternLoc() const { return ExternLoc; }
>    SourceLocation getRBraceLoc() const { return RBraceLoc; }
>    void setExternLoc(SourceLocation L) { ExternLoc = L; }
> -  void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
> +  void setRBraceLoc(SourceLocation L) {
> +    RBraceLoc = L;
> +    HasBraces = RBraceLoc.isValid();
> +  }
>
>    SourceLocation getLocEnd() const LLVM_READONLY {
>      if (hasBraces())
>
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=180591&r1=180590&r2=180591&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Thu Apr 25 20:30:23 2013
> @@ -476,6 +476,13 @@ template <typename T> static bool isInEx
>    return First->getDeclContext()->isExternCContext();
>  }
>
> +static bool isSingleLineExternC(const Decl &D) {
> +  if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext()))
> +    if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces())
> +      return true;
> +  return false;
> +}
> +
>  static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
>                                                LVComputationKind computation) {
>    assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
> @@ -504,7 +511,8 @@ static LinkageInfo getLVForNamespaceScop
>          return PrevVar->getLinkageAndVisibility();
>
>        if (Var->getStorageClass() != SC_Extern &&
> -          Var->getStorageClass() != SC_PrivateExtern)
> +          Var->getStorageClass() != SC_PrivateExtern &&
> +          !isSingleLineExternC(*Var))
>          return LinkageInfo::internal();
>      }
>
> @@ -1580,11 +1588,8 @@ VarDecl::DefinitionKind VarDecl::isThisD
>    //   A declaration directly contained in a linkage-specification is treated
>    //   as if it contains the extern specifier for the purpose of determining
>    //   the linkage of the declared name and whether it is a definition.
> -  const DeclContext *DC = getDeclContext();
> -  if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(DC)) {
> -    if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces())
> -      return DeclarationOnly;
> -  }
> +  if (isSingleLineExternC(*this))
> +    return DeclarationOnly;
>
>    // C99 6.9.2p2:
>    //   A declaration of an object that has file scope without an initializer,
>
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Apr 25 20:30:23 2013
> @@ -1816,14 +1816,14 @@ LinkageSpecDecl *LinkageSpecDecl::Create
>                                           SourceLocation ExternLoc,
>                                           SourceLocation LangLoc,
>                                           LanguageIDs Lang,
> -                                         SourceLocation RBraceLoc) {
> -  return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc);
> +                                         bool HasBraces) {
> +  return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
>  }
>
>  LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
>    void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl));
>    return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(),
> -                                   lang_c, SourceLocation());
> +                                   lang_c, false);
>  }
>
>  void UsingDirectiveDecl::anchor() { }
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Apr 25 20:30:23 2013
> @@ -10507,7 +10507,8 @@ Decl *Sema::ActOnStartLinkageSpecificati
>    // FIXME: Add all the various semantics of linkage specifications
>
>    LinkageSpecDecl *D = LinkageSpecDecl::Create(Context, CurContext,
> -                                               ExternLoc, LangLoc, Language);
> +                                               ExternLoc, LangLoc, Language,
> +                                               LBraceLoc.isValid());
>    CurContext->addDecl(D);
>    PushDeclContext(S, D);
>    return D;
>
> Modified: cfe/trunk/test/SemaCXX/undefined-internal.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/undefined-internal.cpp?rev=180591&r1=180590&r2=180591&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/undefined-internal.cpp (original)
> +++ cfe/trunk/test/SemaCXX/undefined-internal.cpp Thu Apr 25 20:30:23 2013
> @@ -323,3 +323,10 @@ namespace test13 {
>    }
>  }
>
> +namespace test14 {
> +  extern "C" const int foo;
> +
> +  int f() {
> +    return foo;
> +  }
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list